0

我的正则表达式正在工作 - 直到它捕获的字符串形式略有变化。它过去总是采用以下形式:

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]。

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

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

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

4 回答 4

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*.+
于 2012-07-12T13:37:20.097 回答
0

我相信这应该这样做:

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

我所做的更改是:

  • 通过添加“?”使开头的任何字符匹配不贪心。在他们之后 - 当额外的位存在时,这可以防止他们狼吞虎咽。
  • 添加了 '(?:-(\w{1,3}))?' 如果存在,它匹配可选的额外位,但不捕获'-'前缀('?:'使外部组不捕获)。

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

您可以在此处看到它的实际效果(已编辑)。

于 2012-07-12T13:42:18.317 回答
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
于 2012-07-12T13:45:59.190 回答
0

这更清楚 .+\s-\s(.+)\s-\s.+$

于 2012-07-12T14:06:28.673 回答