匹配点后的任何字符,直到下一个点或行尾

时间:2016-04-26 16:01:51

标签: javascript regex

根据我的问题,我希望fooasa .foo. assas匹配,bar .foo

虽然我知道如何处理这些结局条件之一,但我不知道如何将它们结合起来。

我目前的工作看起来像这样:

/\.(.+?)(?=[\.|\Z])/g

5 个答案:

答案 0 :(得分:3)

我建议如下:

\.(\S*)(?=\.|$)

工作原理:

\.    # . (Dot)
(     # Capture Data (foo)
  \S    # Any Non-Whitespace Character
  *     # 0 or more times
)
(?=   # Lookahead (Check) for...
  \.    # . (Dot)
  |     # OR
  $     # End of String
)

您想要的数据存储在 1st捕获组

Live Demo on Regex101

您可能希望将其更改为:

(\ S +?)(= |。$)。

阅读 @РоманПарадеев的评论

您的RegEx问题:

\.(.+?)(?=[\.|\Z])
  • \.很好
  • .+? 毫无意义(实际上,请参阅 @РоманПарадеев的评论,您应该使用它)。
    • +表示 1 或更多次,而*表示 0 或更多次。所以我可以看到你想要的东西,但是使用(.*)更简单(除非字符串中有多个.,并且你希望它不贪婪。再次,参考 @РоманПарадеев的评论)
  • [\.|\Z]无法按预期工作。
    • 首先,无需转义\.,只需使用.。接下来,[]内的任何字符都将匹配。这意味着它将匹配.|\Z。您只能在组内使用|,例如\.|\Z。最后,您可以使用$代替\Z
    • 这意味着可以(?=\.|$) (?=[.\Z]) \Z需要在此使用,因为$字面上匹配$

答案 1 :(得分:0)

您可以使用此正则表达式在第一个DOT之后捕获下一个非点文本:

/^[^.]*\.([^.]*)/

您的文字在捕获的组#1中可用

RegEx Demo

RegEx分手:

^          # line start
[^.]*      # match 0 or more chars that are not DOT
\.         # match a literal DOT
([^.]*)    # match 0 or more chars that are not DOT and capture the text in group #1

<强>代码:

    var re = /^[^.]*\.([^.]*)/gm; 
    var str = 'asa .foo. assas\nbar .foo';
    var m;
    var matches = [];

    while ((m = re.exec(str)) !== null) {
        if (m.index === re.lastIndex)
            re.lastIndex++;
        matches.push(m[1]);
    }

    document.writeln(matches);

答案 2 :(得分:0)

我会使用这样的东西:/\.(\S+?)(?=\.|$)/g

\.字面点
(\S+?)一个或多个非空白字符(非贪婪)
对于点或行尾

(?=\.|$)为正面预测

https://regex101.com/r/vL7cZ1/1

答案 3 :(得分:0)

以下模式应该:

\.(\w+)(?:\.\s+\S+)?$

Regex 101 demo

答案 4 :(得分:0)

在这种情况下我会反对正则表达式。

可以用更易读的方式完成。

'asa .foo. assas'.split('.')[1]