如何在正则表达式中键入":"("冒号")?

jav*_*red 60 java regex

:("冒号")在regexp中有特殊含义,但我需要按原样使用它,就像[A-Za-z0-9.,-:]*.我试图逃避它,但这不起作用[A-Za-z0-9.,-\:]*

Bar*_*ers 100

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

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

[A-Za-z0-9.,-:]*
Run Code Online (Sandbox Code Playgroud)

where ,-:匹配','和之间的所有ascii字符':'.请注意,它仍然匹配文字':'!

试试这个:

[A-Za-z0-9.,:-]*
Run Code Online (Sandbox Code Playgroud)

通过放置-在类的开头或结尾,它与文字匹配"-".正如Keoki Zee的评论中提到的,你也可以逃避-课堂内部,但大多数人只是在最后添加它.

演示:

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 '-'
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 将连字符放在最后可能是前一个程序员所做的,这导致了这个错误.我总是*逃避它:结束循环`:)` (4认同)
  • 你也可以使用反斜杠`[a\-z]`来转义连字符. (3认同)
  • @Keoki:是的,尽管我发现尽可能少地逃避(在Java字符串文字内部双重转义!).不过,提一个_can_也是很好的. (2认同)

Ste*_*roz 9

小心,-有正则表达式的特殊含义.在a中[],如果将它放在最后,你可以毫无问题地使用它.在你的情况下,,-:被视为,:.


小智 5

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

除了\, -, ^(在开始处)和终止符之外的所有非字母数字字符]在字符类中都是非特殊的,但如果它们被转义也没有坏处。

有关 Java 正则表达式的更多信息,请参阅文档

  • 我没有投票反对,但也许是因为您在 Java 正则表达式问题中链接了 PHP 正则表达式文档? (2认同)