【问题标题】:How to use regular expression character class properly?如何正确使用正则表达式字符类?
【发布时间】:2018-12-03 03:33:23
【问题描述】:
String a = "77*b+7-77/98+6";
String b[] = a.split("[*+-/]"); // works fine
b[] = a.split("[+/-  *]"); // gives pattern syntax exception because of   " * "
b[] = a.split("[*/+-]"); // works fine
b[] = a.split("[-*]"); // works fine

请帮我解决这个问题。

【问题讨论】:

    标签: java regex split


    【解决方案1】:

    在正则表达式方括号中[] 表示character class。一个字符类可以有两个用连字符分隔的字符 a-z 来表示一个范围的字符。

    这意味着如果使用连字符,并且范围的任一端无效,则这是一个无效模式。在这种情况下,此连字符必须转义,在 Java 中为 \\-

    但是,如果在字符范围的开始结束处使用连字符,则连字符不会被视为元字符 - 因为它不能是范围.所以你的其他模式有效,因为连字符被有效地转义了。

    b[] = a.split("[*/+-]"); // works fine
                       ^ at the end
    b[] = a.split("[-*]"); // works fine
                    ^ at the start
    

    第一个表达式有+-/,这是ASCII character set+/的有效范围,相当于文字字符+,-./

    错误的表达式有/-,即从/SPACE的范围。 SPACE 是字符 32/ 是字符 47 所以你的范围是 47-32,范围是向后

    【讨论】:

    • 虽然这个答案在技术上可能是正确的,但将破折号移动到课程的开头或结尾以解决问题是一个糟糕的建议。为什么?因为其他人可能会在以后继承您的代码,如果该人不够精明,无法在开头或结尾保留破折号,这可能会导致正则表达式中的错误。
    • @TimBiegeleisen 我在解释为​​什么 OPs 模式有效,而不是提供建议。 OP 想知道为什么某些模式会出错而其他模式不会出错。你的答案似乎没有解释这一点,而我的答案。
    • @RAHULJAISWAL "+" 是 ASCII 字符 "43","/" 是 "47"。由于“43 到 47”是一个有效范围,它“正常”工作。但它会接受字符“,”(44),“-”(45)和“。” (46) 也是。可能不是你想要的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-15
    • 2015-05-21
    • 1970-01-01
    • 2017-12-22
    • 2011-08-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多