2011-07-05 24 views

回答

86

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

你的问题很可能是由于该-充当你的类范围操作符:

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

其中,-:比赛','':'之间的所有ASCII字符。请注意,它仍然匹配文字':'但是!

试试这个:

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

通过将-在开始或之类的结束,它的字面"-"匹配。正如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 '-' 
    } 
} 
+2

您也可以使用反斜杠'[a \ -z]'将连字符转义。 – 2011-07-05 08:44:58

+1

@Keoki:真的,尽管我发现它尽可能避免(在Java字符串内部双重转义)做得更清楚。尽管如此,最好还是提一个_can_逃避它。 –

+3

在末尾放置连字符可能是以前的程序员做的,导致了这个错误。我总是*逃避它:结束循环':)' – Kobi

4

结肠没有特殊的意义在一个角色类中,并且不需要被转义。据the PHP regex docs,需要唯一的字符在字符类转义如下:

所有非字母数字字符等 比\-^(在开始)和 终止]是非特殊 角色类别,但如果它们被转义,则不会造成 危害。

有关Java正则表达式的更多信息,请参见the docs

+0

我不明白为什么这会得到一个downvote,有人可以向我解释什么可能是错误的这个答案吗? – 2011-07-05 09:42:02

+2

我没有投下来,但也许是因为你在一个Java的正则表达式问题链接PHP正则表达式文档? – hcpl

1

使用\\:而不是\: .. \在java字符串中有特殊含义。

+2

尽管反斜杠是Java字符串中的转义字符,但在这里转义反斜杠并不能解决问题,因为':'在正则表达式中并不是一个特殊的字符。 – 2011-07-05 09:04:59

7

小心,-与正则表达式特殊的意义。在[]中,如果将其放置在末尾处,则可以将它放在没有问题的地方。在你的情况下,,-:被视为,:

相关问题