采用以下正则表达式:/^[^abc]/。这将匹配字符串开头的任何单个字符,a、b或c除外。
如果在其后面添加*–/^[^abc]*/–正则表达式将继续向结果中添加每个后续字符,直到它满足a、b或c。
例如,对于源字符串“qwerty qwerty whatever abc hello”,表达式将匹配到“qwerty-qwerty wh”。
但如果我希望匹配的字符串是“qwerty qwerty whatever”呢?
换句话说,我如何将所有内容都匹配到(但不包括)精确的序列“abc”?
采用以下正则表达式:/^[^abc]/。这将匹配字符串开头的任何单个字符,a、b或c除外。
如果在其后面添加*–/^[^abc]*/–正则表达式将继续向结果中添加每个后续字符,直到它满足a、b或c。
例如,对于源字符串“qwerty qwerty whatever abc hello”,表达式将匹配到“qwerty-qwerty wh”。
但如果我希望匹配的字符串是“qwerty qwerty whatever”呢?
换句话说,我如何将所有内容都匹配到(但不包括)精确的序列“abc”?
当前回答
在Python中:
.+?(?=abc)适用于单线情况。
[^]+?(?=abc)不起作用,因为python无法将[^]识别为有效的正则表达式。要使多行匹配工作,需要使用re.DOTALL选项,例如:
re.findall('.+?(?=abc)', data, re.DOTALL)
其他回答
您没有指定使用的是哪种类型的正则表达式,但这将在任何一个最受欢迎的可以被认为是“完整”的工作。
/.+?(?=abc)/
它的工作原理
.+?部分是.+的非贪婪版本(一个或多个任何事情)。当我们使用.+,发动机基本上会匹配一切。然后,如果正则表达式中有其他内容,它将按步骤返回试图匹配以下部分。这是贪婪的行为,意味着尽可能满足。
使用.+?时?,而不是一次匹配,然后返回其他条件(如果有),引擎将通过以下方式匹配下一个字符步骤,直到匹配正则表达式的后续部分(如果有,则再次)。这是不贪婪的,意味着尽可能少地匹配满足
/.+X/ ~ "abcXabcXabcX" /.+/ ~ "abcXabcXabcX"
^^^^^^^^^^^^ ^^^^^^^^^^^^
/.+?X/ ~ "abcXabcXabcX" /.+?/ ~ "abcXabcXabcX"
^^^^ ^
接下来我们有(?={contents}),一个零宽度断言,环顾四周。此分组结构与其内容,但不算作匹配字符(零宽度)。它仅在是否匹配时返回(断言)。
因此,换句话说,正则表达式/.+?(?=abc)/表示:
尽可能少地匹配任何字符,直到找到“abc”,不计算“abc”。
如果您希望捕获“abc”以下的所有内容:
/^(.*?)abc/
说明:
()捕获括号内的表达式,以便使用$1、$2等进行访问。
^匹配行首
.*匹配任何内容?非贪婪(匹配所需的最小字符数)-[1]
[1] 需要这样做的原因是,否则,在以下字符串中:
whatever whatever something abc something abc
默认情况下,正则表达式是贪婪的,这意味着它将尽可能匹配。因此/^.*abc/将匹配“whateverwhatever某物abc某物”。添加非贪婪量词?使正则表达式只匹配“无论什么”。
正如Jared Ng和@Issun所指出的,解决这种正则表达式的关键是“匹配某个单词或子字符串之前的所有内容”或“匹配某一单词或子串之后的所有内容。”。在这里阅读更多关于他们的信息。
在您的特定情况下,可以通过积极的展望来解决:.+?(?=abc)
一幅画胜过千言万语。请参见屏幕截图中的详细说明。
您的问题没有指定后续的字符序列是否是可选的,但所有其他答案都假定序列总是给定的。所以这里有一个,如果序列是可选的。
例如,如果将代码匹配到像foo#这样的行注释。。。或foo//。。。,行注释本身可能是可选的,但可能仍然希望与前面的代码匹配。
在这种情况下,我会使用^(?:(?!abc)。)*(或行注释:^(?:(?!#)。)*或^(?:(?!\/\/).)*)。
说明:^标记行的开头。(?:)是一个非捕获组,因为常规组将额外捕获组中最后一个匹配的字母,这是我们不需要的。在组内,我们使用负前瞻(?!)和。,所以除了特定的序列之外,所有的东西都是匹配的。使用*重复0到无限次。如果只想匹配非空字符串,请改用+。
这将对正则表达式有意义。
确切的单词可以从以下regex命令中获得:
("(.*?)")/g
在这里,我们可以得到属于双引号内的全局准确单词。
例如,如果我们的搜索文本是
这是“双引号”单词的示例
然后我们会从那句话中得到“双引号”。