在数字模式之间捕获

时间:2017-02-22 19:01:22

标签: javascript regex

我试图捕捉这样的结构:

1:1 wefeff qwefejä qwefjk
dfjdf 10:2 jdskjdksdjö
12:1 qwe qwe: qwertyå

我想匹配数字之间的所有内容,后跟冒号,然后是另一组数字。所以预期的输出是:

match 1 = 1:1 wefeff qwefejä qwefjk dfjdf
match 2 = 10:2 jdskjdksdjö
match 3 = 12:1 qwe qwe: qwertyå

以下是我的尝试:

\d+\:\d+.+

但如果有两行的单词字符,则会失败。

我正在使用基于javascript的正则表达式引擎。

2 个答案:

答案 0 :(得分:1)

您可以使用基于tempered greedy token的正则表达式:

/\d+:\d+(?:(?!\d+:\d)[\s\S])*/g

\d+:\d+部分将匹配一个或多个数字,一个冒号,一个或多个数字,(?:(?!\d+:\d)[\s\S])*将匹配任何char,零或更多次出现,不会启动一个或多个序列数字后面跟冒号和数字。请参阅this regex demo

由于调和贪婪令牌是一种消耗资源的构造,您可以unroll it进入更有效的模式,如

/\d+:\d+\D*(?:\d(?!\d*:\d)\D*)*/g

请参阅another regex demo

现在,()变成了一个匹配字符串线性的模式:

  • \D* - 0+非数字符号
  • (?: - 开始匹配零个或多个序列的非捕获组:
    • \d - 一个数字......
    • (?!\d*:\d) - 未跟随0+位数,:和数字
    • \D* - 0+非数字符号
  • )* - 非捕获组的结束。

答案 1 :(得分:0)

你可以使用或不使用ñ-Ñ,但你应该这样做

\d+?:\d+? [a-zñA-ZÑ ]*

编辑:

如果要包含断行,可以将\ n或\ r添加到集合

\d+?:\d+? [a-zñA-ZÑ\n ]*
\d+?:\d+? [a-zñA-ZÑ\r ]* 

试一试!也在https://regex101.com/

进行了测试

更多字符: ^ [a-zA-Z0-9!@#\ $%\ ^ \& *)(+ = ._-] + $