改善我的失败的正则表达式

时间:2012-07-12 13:24:47

标签: c# regex string

我的正则表达式正在运行 - 直到它捕获的字符串形式略有改变。它过去常常是这样的形式:

Word1 - Word2 - 01.2.3456.7890 - xx-xx - Word 3 [Word-inbracket]

我有兴趣捕获xx-xx

为了捕获这些数据,以下正则表达式起作用:

(.+\s*-\s*.+\s*-\s*.+)\s*-\s*(\w{1,3}\s*-\s*\w{1,3})\s*-\s*.+

从中选择组[2]。

然而,现在,字符串已经改变了形式,因此有时会有另一个破折号,以及xx-xx之后的1到4个字符之间的另一组字母。 (请记住,这有时只会发生。)

所以,现在我还需要捕获以下形式的信息:

Word1 - Word2 - 01.2.3456.7890 - xx-xx-XxxX - Word 3 [Word-inbracket]
Word1 - Word2 - 01.2.3456.7890 - xXX-XxX-xxxx - Word 3 [Word-inbracket]

如何编辑我的正则表达式以捕获此字符串以及之前捕获的字符串?最干净的方法是什么?

4 个答案:

答案 0 :(得分:0)

有点hacky,但这会有所作为:

(.+\s*-\s*.+\s*-\s*.+)\s*-\s*((\w{1,3}\s*-\s*\w{1,3})|(\w{1,4}\s*-\s*\w{1,4}))\s*-\s*.+

答案 1 :(得分:0)

我相信应该这样做:

(.+?\s*-\s*.+?\s*-\s*.+?)\s*-\s*(\w{1,3}\s*-\s*\w{1,3})\s*(?:-(\w{1,3}))?\s*-\s*.+

我所做的改变是:

  • 通过添加'?'使开头的任何字符匹配非贪婪在它们之后 - 当额外的位存在时,这会阻止它们吞噬太多。
  • 添加'(?: - (\ w {1,3}))?'如果存在,则匹配可选的额外位,但不捕获' - '前缀('?:'使外组不捕获)。

这将为您提供一个包含可选位的额外捕获组。

您可以在行动here(已修改)中看到它。

答案 2 :(得分:0)

根据输入线,可以采用更简化的方法。

以下正则表达式匹配这两种情况,并且也适用于对已修改部分的任何其他修改。

([^-]*-){3}\s*([^\s]+).*

这应该捕获第一组“Word1 - Word2 - 01.2.3456.7890 - ”,然后是第二组“xx-xx-XxxX”。

另请注意,我假设第二个所需的组不包含空格,因为示例字符串没有空格。

说明:

([^-]*-){3}    # captures the "word1 - word2 - word3.234.234 -" block
\s*
([^\s]+)       # captures the "xx-xx-xxx" block up to the first whitespace char.
.*             # matches the rest of the line

答案 3 :(得分:0)

这个更清楚。+ \ s- \ s(。+)\ s- \ s。+ $