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