Java - 在正则表达式的字符类中转义星号

3

我希望用正则表达式匹配一行文本。这一行包含两个数字,这些数字可以通过加号、减号或星号(乘法)进行分隔。然而,我不确定如何转义星号。

line.matches("[0-9]*[+-*][0-9]*");

我也尝试过 line.matches("[0-9]*[+-\\*][0-9]*"); 但它也没有起作用。

我应该将星号放入单独的组中吗?为什么在这种情况下转义符\\*无法正常工作?

1个回答

7
*字符类[...])中不是元字符,因此您根本不需要转义它。您需要转义的是-,因为在字符类内部,它负责创建字符范围,例如[a-z]
因此,代替代表Unicode表中+*之间放置的所有字符的"[+-*]",请使用:
  • "[+\\-*]"
  • 或将-放置在无法用作范围指示符的位置
    • 在字符类的开头[-+*]
    • 在字符类的结尾[+*-]
    • 或者在有其他范围的情况下紧接着其他范围后面[a-z-+*]

顺便提一下,如果您想在运算符中添加\字面值,您需要将其写成正则表达式中的\\(它是用于转义或访问标准字符类,如\w的元字符,因此我们还需要对其进行转义)。但由于\在字符串文字中也很特殊(它可以通过\n \r \t\uXXXX来表示字符),因此您也需要在那里进行转义。因此,在正则表达式中,\需要表示为\\,在字符串文字中表示为"\\\\ "

顺便说一下2:要表示数字,而不是[0-9],您可以使用\d(在字符串文字中写为"\\d",因为\在那里是特殊的,需要转义)。

顺便说一下3:如果您想确保字符串中至少有两个数字(一个在运算符的每一侧),则需要在[0-9]*处使用+而不是*,因为+表示前一个元素的一个或多个出现,而*表示零个或多个出现。

因此,您的代码可能看起来像:

line.matches("\\d+[-+*]\\d+");

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接