我不习惯他们,并且遇到java语法“匹配”的问题。
我有两个文件,一个是111.123.399.555.xml
,另一个是Conf.xml.
现在我只想用正则表达式获取第一个文件。
string.matches("[1-9[xml[.]]]");
不起作用。
怎么做?
答案 0 :(得分:6)
使用string.matches("[1-9[xml[.]]]");
将无效,因为[]
将创建一个字符类组,而不是捕获组。
这意味着,对于java,你的表达式是"match any of: [1-to-9 [or x, or m, or l [or *any*]]]"
(*任何*这里是因为你没有逃脱.
,因为它会创建a match any character
}命令)
重要的:
“\”被java识别为文字转义字符,并且它作为实际匹配器的转义字符(也是“\”,但是以字符串形式)发送给匹配器,它本身需要被转义,因此,当您在匹配器上使用“\”时,您必须实际使用“\\”。
当你不习惯它时,这有点令人困惑,但总而言之,要向匹配器发送一个实际的“\”以匹配,你可能需要使用“\\\\”!第一个“\\”将成为匹配器的“\”,因此是一个scape角色,第二个“\\”,由第一个转义,将成为实际的“\”字符串!
匹配###.###.###.###.xml
模式的正确模式字符串,其中“#”始终为数字,string.matches("(\\d{3}\\.){4}xml")
及其工作原理如下:
\\d
=将匹配单个数字字符。它是一样的
使用[0-9]
,只是更简单。{3}
指定前一个“恰好3次”的匹配
\\d
。因此匹配###
。\\.
匹配单个点字符。()
说“这是一个捕获组”
到匹配器。它由下一个{4}
使用,从而创建“匹配”
整个###.
组恰好4次“,从而创建了”匹配###.###.###.###.
“。xml
将匹配
完全是“xml”,它沿着前面的项目与该模式完全匹配:“###.###.###.###.xml
”。要进一步学习,请阅读Java's Pattern docs.
答案 1 :(得分:1)
string.matches("[1-9.]+\\.xml")
应该这样做。
[1-9.]+
匹配1到9和/或句点之间的一个或多个数字。 (+
表示“一个或多个”,*
表示“零或更多”,?
表示“零或一个”。)\.xml
匹配.xml
。由于.
在正则表达式中表示“任何字符”,因此如果您希望它表示文字句点,则需要将其转义:\.
(因为这是在Java字符串中,所以反斜杠本身需要被加倍逃脱)。