正则表达式,使两个字符之间的所有内容从一个字符开始

时间:2018-10-14 09:27:32

标签: regex regex-lookarounds

我们这里有一个很奇怪的字符串:

re'\gfby  by  A »;ŸÎ                 \     l o l l i .
p o p - c o l \ n t u s e r . d a t   dŸŸœ~®ã€º &¹UÚÂdŸŸœ~®ã€º
&¹UÚ    eŸŸœ~®ã€º &¹UÚÂrmtmÖpïJÔ

我们想找到

l o l l i . p o p

因此,我们要查找字符串中的第一个".",然后将点的所有内容都保留下来,直到遇到以下任何一种情况:

  • 反斜杠“ \”
  • 破折号“-”
  • 两个空格“ \ s \ s”
  • 字符串“ ^或$”的开头或结尾

点的所有规则都相同,这是另一个测试用例:

\ n t u s e r . d a t dŸŸœ~®ã€º

应该返回

n t u s e r . d a t

我们正在尝试用这种表达方式进行环视:

(?<=\\|\s\s)(\.)(?=\\|\s\s)

我们还对此进行了试验:

(\\|\s\s|-)(.*?)(\.)(.*?)(\\|\s\s|-)

此表达式的问题在于regex首先查看左手参数并将其与字符串中最早的匹配项匹配,我们希望regex开始查看。然后向左/向右走,直到碰到我们的休息之一。

谢谢!

2 个答案:

答案 0 :(得分:0)

re'\gfby  by  A »;ŸÎ                 \     l o l l i .
p o p - c o l \ n t u s e r . d a t   dŸŸœ~®ã€º &¹UÚÂdŸŸœ~®ã€º
&¹UÚ    eŸŸœ~®ã€º &¹UÚÂrmtmÖpïJÔ

这个

(?:(?!  )[^\\.-])+\.(?:(?!  )[^\\.-])+

发现

 l o l l i .
p o p 

 n t u s e r . d a t

故障:

(?:           # begin non-capturing group
  (?!  )      #   look-ahead: any position not followed by two spaces
  [^\\.-]     #   any character except '\', '.', and `-`
)+            # end group, repeat at least once
\.            # a '.'
(?:           # \
  (?!  )      #  |-- exactly the same as above
  [^\\.-]     #  |
)+            # /
  • 如果要允许以点开头或结尾的匹配,请使用*而不是+
  • 单个空格是匹配项的有效部分,因此它们可能会以此开头或结尾出现(在上面的示例中确实如此)。如有必要,修剪结果。
  • 由于匹配是由否定的字符类完成的,因此我们免费获得了附带条件“ ...或字符串的开头/结尾”和“包含换行符”。

答案 1 :(得分:0)

找到第一个“。”在字符串中,然后将点的所有内容保留到遇到其中一项要求之前,可以使用:

^.*?((?:(?!\s\s|[.\\-]).)+\.(?:(?!\s\s|[.\\-]).)+)

Regex demo

您的比赛将在第一个捕获组中。

说明

  • ^断言字符串的开头
  • .*?将任意字符匹配零次或多次非贪婪,因此尽可能地放弃
  • (捕获组
    • (?:非捕获组
      • (?!\s\s|[.\\-]).负向查找,可以断言右侧不是两个空格字符或点,反斜杠或连字符。
    • )+关闭非捕获组更多时间
    • \.从字面上匹配一个点
    • (?:非捕获组
      • (?!\s\s|[.\\-]).负向查找,可以断言右侧不是两个空格字符或点,反斜杠或连字符。
    • )+关闭不捕获的连字符并重复一次或多次
  • )关闭捕获组