我正在寻找一种匹配所有内容的模式,直到第一次出现特定字符,比如“;” - 一个分号。
我写了这个:
/^(.*);/
但它实际上匹配所有内容(包括分号),直到最后一次出现分号。
/^(.*?);/
也应该有效(它被称为 non-greedy),但使用 [^;]*
给出的答案更好。
\w+(?!([^]+;)|;)
,但这不是为什么? .+(?!([^]+;)|;)
你需要
/^[^;]*/
[^;]
是一个字符类,它匹配除分号之外的所有内容。
^(行锚的开始)被添加到正则表达式的开头,因此仅捕获每行上的第一个匹配项。这可能需要也可能不需要,取决于是否需要可能的后续匹配。
要引用 perlre
联机帮助页:
您可以通过在 [] 中包含字符列表来指定字符类,该列表将匹配列表中的任何字符。如果“[”之后的第一个字符是“^”,则该类匹配任何不在列表中的字符。
这应该适用于大多数正则表达式方言。
将;
/^(.*?);/
工作?
?
是一个惰性运算符,因此正则表达式在匹配 ;
之前尽可能少地抓取。
/^[^;]*/
[^;] 表示匹配除分号之外的任何内容。方括号是一个集合匹配运算符,它本质上是匹配这组字符中的任何字符,开头的 ^
使其成为反向匹配,因此匹配该集合中的任何 not。
建议的答案都没有对我有用。 (例如在记事本++中)但是
^.*?(?=\;)
做过。
试试/[^;]*/
谷歌regex character classes
了解详情。
示例文本:
"this is a test sentence; to prove this regex; that is g;iven below"
例如,如果我们有上面的示例文本,则正则表达式 /(.*?\;)/
将为您提供所有内容,直到第一次出现分号 (;
),包括分号:"this is a test sentence;"
;
字符,因为它不是正则表达式特殊字符。也不需要分组 ()
。你可以和/.*?;/
一起去
?
字符使匹配 lazy (匹配尽可能少)。想想正则表达式匹配字符直到第一个分号然后它不会走得更远,因为它放弃了(懒惰;))
这对我很有帮助,因为我试图弄清楚如何匹配 xml 标记中的所有字符,包括属性。我遇到了“将所有内容匹配到最后”的问题:
/<simpleChoice.*>/
但能够通过以下方式解决问题:
/<simpleChoice[^>]*>/
读完这篇文章后。谢谢大家。
<!DOCTYPE>
标记中有语法错误的 xml 文档。由于解析器无法处理它。
这不是正则表达式解决方案,但对于您的问题描述来说足够简单。只需拆分您的字符串并从您的数组中获取第一项。
$str = "match everything until first ; blah ; blah end ";
$s = explode(";",$str,2);
print $s[0];
输出
$ php test.php
match everything until first
这将仅匹配每个字符串中的第一次出现,并将忽略后续出现。
/^([^;]*);*/
"/^([^\/]*)\/$/"
为我工作,仅从数组中获取顶级“文件夹”,例如:
a/ <- this
a/b/
c/ <- this
c/d/
/d/e/
f/ <- this
真的有点遗憾,没有人给你正确的答案......
在正则表达式中,?使它不贪婪。默认情况下,正则表达式将尽可能匹配(贪婪)
只需添加一个 ?它将是非贪婪的并且尽可能少地匹配!
祝你好运,希望有帮助。
这适用于从行首到第一个单词获取内容,
/^.*?([^\s]+)/gm
我遇到了一个类似的问题,包括所有字符,直到单词 entity_id
之后的第一个逗号。在 Bigquery 中有效的解决方案是:
SELECT regexp_extract(line_items,r'entity_id*[^,]*')
foo=bar;baz=bax;bab=baf
并且它匹配bab=baf
即使没有;
正是我需要的。如果规范说除了目标符号之外的所有内容都匹配,不确定为什么它会起作用......