【问题标题】:How to type ":" ("colon") in regexp?如何在正则表达式中输入“:”(“冒号”)?
【发布时间】:2011-09-28 15:00:05
【问题描述】:

:(“冒号”)在正则表达式中有特殊含义,但我需要按原样使用,比如[A-Za-z0-9.,-:]*。 我试图逃避它,但这不起作用[A-Za-z0-9.,-\:]*

【问题讨论】:

  • 也许你需要两个反斜杠来转义它?
  • 你想匹配什么?

标签: java regex


【解决方案1】:

冒号在字符类中没有特殊含义,不需要转义。根据the PHP regex docs,字符类中唯一需要转义的字符如下:

其他所有非字母数字字符 比\-^(开始时)和 终止] 是非特殊的 字符类,但它没有害处 如果他们逃脱了。

有关 Java 正则表达式的详细信息,请参阅the docs

【讨论】:

  • 我不明白为什么这会被否决,有人可以向我解释一下这个答案可能有什么问题吗?
  • 我没有投反对票,但可能是因为您在 Java 正则表达式问题中链接了 PHP 正则表达式文档?
【解决方案2】:

使用\\: 代替\:.. \ 在java 字符串中有特殊含义。

【讨论】:

  • 虽然反斜杠确实是 Java 字符串中的转义字符,但在此处转义反斜杠并不能解决问题,因为 : 无论如何都不是正则表达式中的特殊字符。跨度>
【解决方案3】:

在大多数正则表达式实现(包括 Java 的)中,: 没有特殊含义,无论是在字符类内部还是外部。

您的问题很可能是由于- 在您的类中充当范围运算符:

[A-Za-z0-9.,-:]*

其中,-: 匹配','':' 之间的所有ascii 字符。请注意,它仍然与文字 ':' 匹配!

试试这个:

[A-Za-z0-9.,:-]*

通过将- 放在类的开头或结尾,它与文字"-" 匹配。正如 Keoki Zee 在 cmets 中提到的,您也可以在类中转义 -,但大多数人只是在末尾添加它。

一个演示:

public class Test {
    public static void main(String[] args) {
        System.out.println("8:".matches("[,-:]+"));      // true: '8' is in the range ','..':'
        System.out.println("8:".matches("[,:-]+"));      // false: '8' does not match ',' or ':' or '-'
        System.out.println(",,-,:,:".matches("[,:-]+")); // true: all chars match ',' or ':' or '-'
    }
}

【讨论】:

  • 您还可以使用反斜杠 [a\-z] 转义连字符。
  • @Keoki:是的,尽管我发现尽可能少地进行转义(在 Java 字符串文字中进行双重转义!)更清楚。不过,提一个可以逃脱它也很好。
  • 把连字符放在最后可能是以前的程序员做的,导致了这个错误。我总是逃避它:结束循环:)
  • @Kobi,不知道- 的人在字符类中是特殊的,不应该干预正则表达式! :)。不过说真的,是的,您的选择肯定是更安全的选择!
  • @BartKiers 没错,但 SO 也是人们来学习的地方。我发现自己在这里的主要原因是因为我无法捕获冒号,虽然我的问题不一样,但答案帮助我解决了问题。
【解决方案4】:

小心,- 与正则表达式有特殊含义。在[] 中,如果放在末尾​​strong>,您可以毫无问题地放置它。在您的情况下,,-: 被视为 ,:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-26
    • 1970-01-01
    • 2013-05-04
    • 2017-09-04
    • 1970-01-01
    • 2021-03-12
    • 2022-01-23
    • 1970-01-01
    相关资源
    最近更新 更多