【问题标题】:Java - Escape star in character class in regex [duplicate]Java - 正则表达式中字符类中的转义星[重复]
【发布时间】:2015-03-24 07:37:51
【问题描述】:

我想用正则表达式匹配一行。该行包含两个数字,可以除以加号、减号或星号(乘法)。但是,我不知道如何逃脱星星。

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

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

我应该把星星分成不同的组吗?为什么在这种情况下转义 \\* 不起作用?

【问题讨论】:

    标签: java regex


    【解决方案1】:

    * 不是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+");
    

    【讨论】:

      猜你喜欢
      • 2011-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-08
      • 1970-01-01
      相关资源
      最近更新 更多