根据我的问题,我希望foo
与asa .foo. assas
匹配,bar .foo
。
虽然我知道如何处理这些结局条件之一,但我不知道如何将它们结合起来。
我目前的工作看起来像这样:
/\.(.+?)(?=[\.|\Z])/g
答案 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
捕获组
您可能希望将其更改为:
(\ S +?)(= |。$)。
阅读 @РоманПарадеев的评论
您的RegEx问题:
\.(.+?)(?=[\.|\Z])
\.
很好.+?
毫无意义(实际上,请参阅 @РоманПарадеев的评论,您应该使用它)。
+
表示 1 或更多次,而*
表示 0 或更多次。所以我可以看到你想要的东西,但是使用(.*)
更简单(除非字符串中有多个.
,并且你希望它不贪婪。再次,参考 @РоманПарадеев的评论)[\.|\Z]
无法按预期工作。
\.
,只需使用.
。接下来,[]
内的任何字符都将匹配。这意味着它将匹配.
,|
或\Z
。您只能在组内使用|
,例如\.|\Z
。最后,您可以使用$
代替\Z
(?=\.|$)
或 (?=[.\Z])
\Z
需要在此使用,因为$
字面上匹配$
答案 1 :(得分:0)
您可以使用此正则表达式在第一个DOT之后捕获下一个非点文本:
/^[^.]*\.([^.]*)/
您的文字在捕获的组#1中可用
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+?)
一个或多个非空白字符(非贪婪)
对于点或行尾
(?=\.|$)
为正面预测
答案 3 :(得分:0)
答案 4 :(得分:0)
在这种情况下我会反对正则表达式。
可以用更易读的方式完成。
'asa .foo. assas'.split('.')[1]