与字符串÷x%匹配的正则表达式

时间:2018-08-06 10:11:12

标签: java regex exception

我一直在尝试创建与以下模式匹配的正则表达式:

÷x%

这是我的代码:

String string = "÷x%2%x#3$$@";
String myregex = "all the things I've tried";
string = string.replaceAll(myregex,"÷1x#1$%");

我尝试了以下正则表达式:(÷x%),[÷] [x] [%],[÷] {1} [x] {1} [%] {1}

我正在使用NetBeans IDE,它给了我

  

非法组参考

但是,当我将string的值更改为其他值时,例如一个单词。

NetBeans不会给我例外。

任何想法,谢谢

3 个答案:

答案 0 :(得分:1)

要替换所有出现的子字符串,您不需要模式。您可以使用String.replace()

String input = "÷x%abc÷x%def÷x%";
String output = input.replace("÷x%", "÷1x#1$%");
System.out.println(output); // ÷1x#1$%abc÷1x#1$%def÷1x#1$%

按照方法javadoc:

  

将该字符串中与文字目标序列匹配的每个子字符串替换为指定的文字替换序列。

答案 1 :(得分:0)

根据问题中的评论,我希望这将为replaceAll的工作原理提供一些启示。

根据JavaDoc,replaceAll将正则表达式作为第一个参数。就您而言,正则表达式似乎很合理,因此这里没有问题。

replaceAll接受的第二个参数是用于替换正则表达式匹配的字符串。

在某些情况下,您需要将相同的模式替换为相同的字符串(如果需要,可以使用硬编码):

String myString = "123abc1344";
myString = myString.replaceAll("\\d+", "number");
myString = myString.replaceAll("\\w+", "word");
System.out.println(myString); //Would yield something of the sort: numberwordnumber

BUT ,在某些情况下,您想在替换字符串本身中使用要替换的块。这是$出现的地方:

String myString =“年龄:9;性别:男”;

让我们说,您想将字符串的格式更改为以下内容:“我是{性别},我是{年龄}岁。”

在这种情况下,您的替换字符串需要从要替换的字符串中提取信息,并将其注入到替换本身中。您可以使用以下方法做到这一点:

String myString = "Age:9;Gender:Male";
myString = myString.replaceAll("Age:(\\d+);Gender:(\\w+)", "I am a $2 and I am $1 years of age.";

上面的代码应该产生您所需要的字符串。请注意,我正在使用$ 1和$ 2访问正则表达式组。在正则表达式语言中,第0组是整个正则表达式所匹配的。任何其他圆括号都表示可以通过$关键字访问的另一个正则表达式组。

这就是为什么需要对其进行转义的原因。

答案 2 :(得分:0)

在Java正则表达式中,您必须转义$符号。

如果您写$%,则将引用不存在的组%。

您可以尝试:

Public Sub test05()
Dim dt As Date, fromDate As Date, toDate As Date
Dim dayCounter As Long
Dim sheet As Worksheet
Dim dtArr() As Date
Set sheet = Sheets("Sheet1")
fromDate = DateSerial(2018, 8, 6)
toDate = DateSerial(2023, 8, 5)
ReDim dtArr(1 To toDate - fromDate + 1, 1 To 1)
sheet.Cells.ClearContents
dayCounter = 0
For dt = fromDate To toDate
    wd = Weekday(dt)
    Select Case wd
    Case 1, 7
        'skip weekends
    Case Else
    dayCounter = dayCounter + 1

    dtArr(dayCounter, 1) = dt

    'print the dates (one by one) to the sheet in column 1
    sheet.Cells(dayCounter, 1).Value2 = dt
    End Select
Next 'end of each day

'print all the dates array to the sheet in bulk, in column 2
Dim rng As Range
With sheet
    Set rng = .Range(.Cells(1, 2), .Cells(dayCounter, 2))
End With

rng.Value2 = dtArr

End Sub