2016-01-20 169 views
1

我试图得到下面的表达式一个正则表达式分离,但不能让它:正则表达式的第一个字和一个字符串的最后一个字

  • 字符串有4个字用点分隔的()。 。
  • 第一个单词匹配给定的单词(例如HELLO)。
  • 第二和第三个单词可以有任何字符,但点本身(。)。
  • 最后一个单词再次匹配给定的单词(例如,csv)。

所以:

  • HELLO.something.Somethi#gElse.csv应该匹配。
  • something.HELLO.?.csv不应该匹配。
  • HELLO.something ... csv不应该匹配。
  • HELLO.something.somethingelse.notcsv不应该匹配

我可以分裂做(。),然后检查是否有个别单词,但我试图把它与正则表达式和Pattern类工作。

任何帮助将非常感激。

+0

欢迎来到Stack Overflow!请包含一些代码以显示您尝试过的内容。 –

回答

3

这是比较直接的,只要你明白字符类。带方括号的正则表达式[xyz]与列表中的任何字符匹配{x, y, z};正则表达式[^xyz]匹配除{x, y, z}以外的任何字符

现在你可以构建你的表达:

^HELLO\.[^.]+\.[^.]+\.csv$ 

+意味着“一个或多个前面的表达式”; \.的意思是“点本身”。 ^的意思是“字符串的开始”; $表示“字符串的结尾”。这些锚防止正则表达式的匹配

blahblahHELLO.world.world.csvblahblah 

Demo.

一个共同的目标写这样的正则表达式是捕获一些内容,例如,第一和第二点,和之间的串第二个和第三个点之间的字符串。使用捕获组带来这些字符串的内容转换成Java程序:

^HELLO\.([^.]+)\.([^.]+)\.csv$ 

每对括号的限定捕获组,从1索引(索引零组代表整个表达式的捕获)。一旦从模式获得匹配对象,就可以查询它的组,并提取相应的字符串。

请注意,Java正则表达式中的反斜杠需要加倍。

+0

如果'HELLO ... csv'是一个有效的匹配,那么从'+' - *一个或多个*切换到'*' - *零个或多个*。 – OldCurmudgeon

+0

很好的答案。您可能想要演示一个正则表达式,其中第一个单词可以是HELLO或WORLD或FOO,最后一个单词可以是csv或xls或txt –

+0

还可以提到使用组来收集匹配中的每个单词。 – OldCurmudgeon

相关问题