2012-05-08 80 views
0

我不习惯他们,并与Java语法“匹配”的麻烦。多个正则表达式

我有两个文件一个是111.123.399.555.xml另一种是Conf.xml.

现在我只希望得到使用正则表达式的第一个文件。

string.matches("[1-9[xml[.]]]"); 

没有用。

如何做到这一点?

+0

你想'/([1-9] {3} \。){4} XML /'? – Bergi

+1

我写了一篇[博客文章](http://xisb.wordpress.com/2012/05/09/what-absolutely-every-programmer-should-know-about-regular-expressions/)给出一个真实的简要概述在正则表达式上,绝对基本的,每个人都应该知道。也许它可以帮助你了解更多细节。 – stema

回答

6

使用string.matches("[1-9[xml[.]]]");将不起作用,因为[]将创建一个字符类组,而不是一个捕获组。

这意思是说,去渣,你的表情是说"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.

+0

非常感谢你! – ctekk

+0

如何使语法也能识别这样的模式#。#。#。#。xml ??? (也##。#。###。#。xml应该工作等) – ctekk

+1

感谢您的链接解决它:“(\\ d + \\。){4} xml” – ctekk

1
string.matches("[1-9.]+\\.xml") 

应该这样做。

  • [1-9.]+与1和9和/或句点之间的一个或多个数字匹配。 (+表示“一个或多个”,*表示“零个或多个”,?表示“零个或一个”)。
  • \.xml比赛.xml。由于.意味着正则表达式中的“任何字符”,如果您希望它意味着一个文字周期:\.(因为它位于Java字符串中,所以反斜杠本身需要加倍转义),您需要转义它。
+0

你能向我解释一下吗?什么是“+”和“\\”?还有为什么会有“。”里面的“[1-9]” – ctekk

+2

阅读此http://docs.oracle.com/javase/1.4.2/docs/api/java/util/regex/Pattern.html –

+0

这工作:[1. - 9 。] + \\。xml感谢您的帮助和解释我会接受它 – ctekk