C# 改进我失败的正则表达式

C# 改进我失败的正则表达式,c#,regex,string,C#,Regex,String,我的正则表达式一直在工作,直到它捕获的字符串的形式略有改变。它过去的形式一直是: Word1-Word2-01.2.3456.7890-xx-xx-word3[wordinblack] 我对捕捉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-word3[wordinblack]
我对捕捉
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[单词插入框架]
Word1-Word2-01.2.3456.7890-xXX-xXX-xxxx-Word3[WordInBracket]
等等


除了先前捕获的字符串外,如何编辑正则表达式以捕获该字符串?做这件事最干净的方法是什么?

有点老套,但这样就可以了:

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

我认为这应该做到:

(.+?\s*-\s*.+?\s*-\s*.+?)\s*-\s*(\w{1,3}\s*-\s*\w{1,3})\s*(?:-(\w{1,3}))?\s*-\s*.+
我所做的更改是:

  • 通过在任意字符后面添加“?”,使其在开始时匹配为非贪婪字符-这可以在存在额外位时阻止它们过度吞噬
  • 添加了“(?:-(\w{1,3}))?”,它匹配可选的额外位(如果存在),但不捕获“-”前缀(“?:”使外部组不捕获)
这将为您提供一个额外的捕获组,其中包括可选位


您可以看到它正在运行(已编辑)。

根据输入行,可以采取更简化的方法

以下正则表达式与这两种情况都匹配,并且也适用于对所修改零件的任何其他修改

([^-]*-){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
这更清楚了。+\s-\s(+)\s-\s+$