正则表达式:匹配首次出现的字符


356

我正在寻找一种与所有内容匹配的模式,直到第一次出现特定字符,例如“;”。- 分号

我这样写:

/^(.*);/

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


65
/^(.*?);/应该也可以工作(称为non-greedy),但是使用给出的答案[^;]*更好。
Pascal 2010年

您将如何选择所有内容(分号之后,而不是分号本身)。
穆罕默德·乌默

看到这有效,\w+(?!([^]+;)|;)但这不是为什么吗?.+(?!([^]+;)|;)
穆罕默德·乌默

1
帕斯卡尔,你应该写那个作为答案!
肖恩·肯德尔2015年

@Pascal这适合作为答案!谢谢!
neverMind9

Answers:


503

你需要

/[^;]*/

[^;]字符类,它匹配一切,但一个分号。

引用perlre联机帮助页:

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

这在大多数正则表达式中都适用。


关于此解决方案的重要之处在于,它也与行尾匹配,例如,在我的情况下foo=bar;baz=bax;bab=bafbab=baf即使没有;我所需要的也匹配。不确定规格说明是否匹配目标符号之外的所有内容,为什么它仍然有效...
skryvets 19/12/16


38

/^[^;]*/

[^;]说匹配除分号之外的任何东西。方括号是集合匹配运算符,从本质上讲,它匹配此字符集中的任何字符,^开始时使其成为反匹配,因此匹配此集合中存在的任何字符。


3
请注意,此答案中的第一个^赋予正则表达式完全不同的含义:它使正则表达式仅查找从字符串开头开始的匹配项。在这种情况下,如果只运行一次正则表达式,那实际上将是无操作。如果要在单个字符串中查找多个匹配项,则必须去第一个^。
丹·布雷斯劳

4
他确实说过他想匹配所有内容,直到第一次出现分号为止,所以我认为他的意思是从字符串的开头开始。
Glenn Slaven 2010年



8

示范文本:

"this is a test sentence; to prove this regex; that is g;iven below"

例如,如果我们有上面的示例文本,则正则表达式/(.*?\;)/将为您提供一切,直到第一次出现分号(;)为止,包括分号:"this is a test sentence;"


3
不必转义;char,因为它不是正则表达式的特殊字符。()也不需要分组。您可以选择/.*?;/
Aliaksei Kliuchnikau 2012年

1
是的,你说的很对。逃避更像是“比安全更好而不是抱歉”
poncius 2012年

2
这是我一直在寻找的答案。所以 ?使比赛在第一次发生时结束?正则表达式的这个...(叫它)属性的名称是什么?
Parziphal 2012年

1
@Parziphal ?字符使匹配变得懒惰(匹配次数越少越好)。考虑一下正则表达式在第一个分号之前匹配字符,然后它不再走了,因为它放弃了(懒惰;))
derekantrican

5

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

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

输出

$ php test.php
match everything until first

5

这对我非常有帮助,因为我试图弄清楚如何匹配xml标记中的所有字符(包括属性)。我遇到了“一切都匹配到最后”的问题:

/<simpleChoice.*>/

但能够通过以下方式解决此问题:

/<simpleChoice[^>]*>/

看完这篇文章后。谢谢大家


1
我发现实际解析(每种语言或框架都有其自己的类)html / xml更为有效,因为它是机器格式的,而regex用于自然语言。
莱昂·费多托夫

1
真好 我用它来修复<!DOCTYPE>标记中语法错误的xml文档。由于解析器无法处理它。
Martin Schneider

5

这将仅与每个字符串中的第一个匹配项匹配,并且将忽略后续的匹配项。

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

3

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

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

2

真遗憾,没人能给您正确答案。

在正则表达式中,使它不贪心。默认情况下,正则表达式将尽可能匹配(贪婪)

只需添加一个?它将是非贪婪的,并且匹配得越少越好!

祝您好运,希望对您有所帮助。


3
这在很大程度上取决于实际的正则表达式实现,并非每个实现都具有非贪婪模式。
karatedog

0

我找到

/^[^,]*,/

效果很好。

“,”是此处的“定界符”。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.