我坚持以最干净的方式来完成两位正则表达式。 到目前为止我想出的每个解决方案似乎都很笨拙。
示例文本匹配:选择:blah blah blah 123 代表 100 个字符,这匹配 NoMatch:选择:等等等等 123!对于 100'ish 字符?,.此潜在匹配失败! ?和.
第一个正则表达式
(?:^\w+?:)(((?![.!?]).)*)$
需要:
word
后跟 :
的行,只要在同一行中找不到 !?.
(word:
将始终位于行的开头)Choose:
之外的所有行。 匹配整条线仍然是胜利。第二个正则表达式
^(^\w+?:)(?:(?![.!?]).)*$
需要:
word
后跟 :
的行,只要在同一行中找不到 !?.
(word:
将始终位于行的开头)Choose:
正则表达式位于 Greasemonkey/tampermonkey 脚本中。
使用
^\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
对于第一个模式,您可以首先使用负前视检查是否存在
!
?
或 .
存在。然后在第一组中捕获 1+ 个单词字符和 :
以及第 2 组中的其余行。
^(?![^!?.\n\r]*[!?.])(\w+:)(.*)$
^
字符串开头(?!
负向前看,断言右边的不是
[^!?.\n\r]*[!?.]
使用 contrast 匹配除列出的字符之外的任意字符 0 次以上,然后匹配 !
?
.
)
关闭前瞻(\w+:)
捕获第 1 组,匹配 1+ 个单词字符和冒号(.*)
捕获第 2 组,匹配除换行符之外的任何字符 0+ 次$
字符串结束对于第二部分,如果您只想匹配
Choose:
,则可以仅使用负前瞻而不使用捕获组。
^(?![^!?.\n\r]*[!?.])\w+:
这应该可以实现你想要的。
(?:^\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