【发布时间】:2015-03-24 07:37:51
【问题描述】:
我想用正则表达式匹配一行。该行包含两个数字,可以除以加号、减号或星号(乘法)。但是,我不知道如何逃脱星星。
line.matches("[0-9]*[+-*][0-9]*");
我也试过line.matches("[0-9]*[+-\\*][0-9]*");,但它也不起作用。
我应该把星星分成不同的组吗?为什么在这种情况下转义 \\* 不起作用?
【问题讨论】:
我想用正则表达式匹配一行。该行包含两个数字,可以除以加号、减号或星号(乘法)。但是,我不知道如何逃脱星星。
line.matches("[0-9]*[+-*][0-9]*");
我也试过line.matches("[0-9]*[+-\\*][0-9]*");,但它也不起作用。
我应该把星星分成不同的组吗?为什么在这种情况下转义 \\* 不起作用?
【问题讨论】:
* 不是character class ([...]) 中的元字符,因此您根本不需要转义它。您需要转义的是-,因为在字符类内部它负责创建范围 的字符,例如[a-z]。
因此,使用 "[+-*]" 代替 "[+-*]" 表示放置在 Unicode 表中 + 和 * 之间的所有字符
"[+\\-*]" -放在不能用作范围指示器的地方
[-+*] [+*-]
[a-z-+*],就在其他范围之后
顺便说一句,如果您想将\ 文字添加到您的运算符中,您需要在正则表达式中将其写为\\(它是用于转义或访问\w 等标准字符类的元字符,因此我们还需要逃脱它)。但是由于\ 在字符串字面量中也很特殊(它可以通过\n \r \t 或\uXXXX 来表示字符),因此您还需要在那里对其进行转义。所以在正则表达式中\ 需要表示为\\,它作为字符串文字写为"\\\\"。
顺便说一句 2:要表示数字而不是 [0-9],您可以使用 \d(写成字符串文字为 "\\d",因为 \ 在那里很特殊,需要转义)。
顺便说一句 3:如果您想确保字符串中至少有两个数字(运算符的每一侧一个),您需要在 [0-9]* 使用 + 而不是 *,因为 +表示一次或多次出现前一个元素,而*表示0次或多次出现。
所以你的代码看起来像
line.matches("\\d+[-+*]\\d+");
【讨论】: