我正在寻找一个模式,匹配所有的东西,直到第一次出现一个特定的字符,说一个“;”-分号。

我这样写道:

/^(.*);/

但它实际上匹配所有内容(包括分号),直到最后出现一个分号。


当前回答

我遇到了一个类似的问题,包括所有字符,直到单词entity_id后面的第一个逗号。Bigquery的解决方案是这样的:

SELECT regexp_extract(line_items,r'entity_id*[^,]*') 

其他回答

这不是一个正则表达式解决方案,而是对您的问题描述足够简单的解决方案。只需分割字符串并从数组中获取第一项。

$str = "match everything until first ; blah ; blah end ";
$s = explode(";",$str,2);
print $s[0];

输出

$ php test.php
match everything until first

你需要

/^[^;]*/

[^;]是一个字符类,它匹配除分号以外的所有字符。

^ (start of line anchor)被添加到正则表达式的开头,因此只捕获每行上的第一个匹配。这可能需要,也可能不需要,这取决于是否需要可能的后续匹配。

引用perlre manpage:

您可以通过在[]中包含一个字符列表来指定一个字符类,它将匹配列表中的任何字符。如果“[”后面的第一个字符是“^”,则类匹配列表之外的任何字符。

这应该适用于大多数正则表达式方言。

尝试/ [^;]* /

这是一个否定字符类。

"/^([^\/]*)\/$/"为我工作,从数组中只获得顶部的"文件夹":

a/   <- this
a/b/
c/   <- this
c/d/
/d/e/
f/   <- this

这将只匹配每个字符串中的第一个出现,并忽略后续出现。

/^([^;]*);*/