正则表达式如何仅在存在另一个字符时才捕获字符串

时间:2014-10-26 21:55:59

标签: regex string regex-lookarounds

我想使用正则表达式捕获字符串中的所有内容,最后是冒号,后跟空格:或逗号后跟空格,,但只使用逗号作为条件如果在字符串中可以找到带空格的冒号。换句话说,如果没有:,我不想捕捉任何东西。如果字符串中有:,我想要抓住所有内容,直到,,如果,位于:之前。

我正在尝试

/(?:(?!: )[^])*/g 

/(?:(?!: )[^])*/g

一些示例文字:

这里我只想捕获DeBary

DeBary, OH: Suddenly on Thursday, June 16, 2011 at the age of 78.

这里我只想捕获DeBary

DeBary: Suddenly on Thursday, June 16, 2011 at the age of 78.

在这里,我想什么都不捕捉:

Suddenly on Thursday, June 16, 2011 at the age of 78.

5 个答案:

答案 0 :(得分:1)

如上所述,如果你想捕获匹配的子字符串,那么你需要一个捕获,而不是一个非捕获组,其中包含量词+ 小组:

^([^,:]+)(?=.*?:)

答案 1 :(得分:0)

你可以通过前瞻来做到这一点:

^(?:[^,:])+(?=.*?:)

Regex101 demo

(?:[^,:])+捕获一系列不是逗号或冒号的字符。

(?=.*?:)要求此匹配后跟任何任何字符,然后在某处冒号。

答案 2 :(得分:0)

这可能有用。

 # (?s)^(?=.*:[ ]).*?(?=[,:][ ])

 (?s)               # Dot-all modifier     
 ^                  # BOS
 (?= .* : [ ] )     # Lookahead for colon then space 
 .*?                # Consume minimal any chars up until
 (?= [,:] [ ] )     # Lookahead, Comma or colon, then whitespace

或者,它可以在没有最终前瞻的情况下完成。

 # (?s)^(?=.*:[ ])[^,:]*

 (?s)               # Dot-all modifier     
 ^                  # BOS
 (?= .* : [ ] )     # Lookahead for colon then space 
 [^,:]*             # Consume non comma nor colon

答案 3 :(得分:0)

此模式应该捕获您想要的内容:

^([^\n,:]+)(?=.*:)

示例:

<强> http://regex101.com/r/vE0eP4/1

^[^\n,:]+(?=.*:)

答案 4 :(得分:0)

你可以不用前瞻地做到这一点:

^(.*?)(?:, .*: |: )

这假设实现给出了最左边的替换优先级,大多数都是。