正则表达式在找到某些字符时排除整行匹配

问题描述 投票:0回答:3

我坚持以最干净的方式来完成两位正则表达式。 到目前为止我想出的每个解决方案似乎都很笨拙。

示例文本
匹配:选择:blah blah blah 123 代表 100 个字符,这匹配

NoMatch:选择:等等等等 123!对于 100'ish 字符?,.此潜在匹配失败! ?和.

第一个正则表达式

(?:^\w+?:)(((?![.!?]).)*)$
需要:

  • 匹配包含任何
    word
    后跟
    :
    的行,只要在同一行中找不到
    !?.
    word:
    将始终位于行的开头)
  • 理想情况下,匹配示例中除
    Choose:
    之外的所有行。 匹配整条线仍然是胜利。

第二个正则表达式

^(^\w+?:)(?:(?![.!?]).)*$
需要:

  • 匹配包含任何
    word
    后跟
    :
    的行,只要在同一行中找不到
    !?.
    word:
    将始终位于行的开头)
  • 仅匹配
    Choose:

正则表达式位于 Greasemonkey/tampermonkey 脚本中。

javascript regex greasemonkey tampermonkey
3个回答
1
投票

使用

^\w+:(?:(?!.*[.!?])(.*))?

参见证明

解释

NODE                     EXPLANATION
--------------------------------------------------------------------------------
  ^                        the beginning of the string
--------------------------------------------------------------------------------
  \w+                      word characters (a-z, A-Z, 0-9, _) (1 or
                           more times (matching the most amount
                           possible))
--------------------------------------------------------------------------------
  :                        ':'
--------------------------------------------------------------------------------
  (?:                      group, but do not capture (optional
                           (matching the most amount possible)):
--------------------------------------------------------------------------------
    (?!                      look ahead to see if there is not:
--------------------------------------------------------------------------------
      .*                       any character except \n (0 or more
                               times (matching the most amount
                               possible))
--------------------------------------------------------------------------------
      [.!?]                    any character of: '.', '!', '?'
--------------------------------------------------------------------------------
    )                        end of look-ahead
--------------------------------------------------------------------------------
    (                        group and capture to \1:
--------------------------------------------------------------------------------
      .*                       any character except \n (0 or more
                               times (matching the most amount
                               possible))
--------------------------------------------------------------------------------
    )                        end of \1
--------------------------------------------------------------------------------
  )?                       end of grouping

0
投票

对于第一个模式,您可以首先使用负前视检查是否存在

!
?
.
存在。然后在第一组中捕获 1+ 个单词字符和
:
以及第 2 组中的其余行。

^(?![^!?.\n\r]*[!?.])(\w+:)(.*)$
  • ^
    字符串开头
  • (?!
    负向前看,断言右边的不是
    • [^!?.\n\r]*[!?.]
      使用 contrast 匹配除列出的字符之外的任意字符 0 次以上,然后匹配
      !
      ?
      .
  • )
    关闭前瞻
  • (\w+:)
    捕获第 1 组,匹配 1+ 个单词字符和冒号
  • (.*)
    捕获第 2 组,匹配除换行符之外的任何字符 0+ 次
  • $
    字符串结束

正则表达式演示

对于第二部分,如果您只想匹配

Choose:
,则可以仅使用负前瞻而不使用捕获组。

^(?![^!?.\n\r]*[!?.])\w+:

正则表达式演示


0
投票

这应该可以实现你想要的。

(?:^\w+:)((?:(?![!?.]).)*)$

以下是分步说明:

    (?: ... )  non-capturing group
    ^          start with
    \w+:       a series of one or more word characters followed by a :
    ( ... )$   capturing group that continues to the end
    (?: ... )* non-capturing group, repeated zero or more times, with
    (?! ... )  negative look-ahead: no following character can be
    [!?.]      either ?, ! or .
    .          followed by any character
© www.soinside.com 2019 - 2024. All rights reserved.