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

Leo*_*tov 318 regex

我正在寻找一个匹配所有内容的模式,直到第一次出现特定字符,比如";" - 分号.

我写了这个:

/^(.*);/
Run Code Online (Sandbox Code Playgroud)

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

sle*_*ske 455

你需要

/[^;]*/
Run Code Online (Sandbox Code Playgroud)

[^;]是一个字符类,它匹配除了分号之外的所有内容.

引用手册perlre页:

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

这适用于大多数正则表达式方言.


RJF*_*ner 277

将;

/^(.*?);/
Run Code Online (Sandbox Code Playgroud)

工作?

?是一个懒惰的运算符,因此正则表达式在匹配之前尽可能少地抓取;.

  • 是的,请记住TMTOWTDI是一个perl moto :) http://en.wikipedia.org/wiki/TMTOWTDI (3认同)
  • 是的,但是在Tim Toady的碳酸氢盐扩展之后,我相信否定的角色类赢了,因为懒惰的量词包括回溯.+1无论如何. (3认同)
  • 值得一读性能主题:http://blog.stevenlevithan.com/archives/greedy-lazy-performance (3认同)

Gle*_*ven 34

/^[^;]*/

[^;]表示匹配除分号之外的任何内容.方括号是一个集匹配运算符,它本质上匹配这组字符中的任何字符^,一开始使它成为一个反向匹配,所以匹配不在此集合中的任何东西.

  • 他确实说他想要匹配所有内容,直到第一次出现分号,所以我认为他的意思是从字符串的开头. (4认同)
  • 请注意,此答案中的第一个^赋予正则表达式完全不同的含义:它使正则表达式仅查找从字符串开头开始的匹配.在这种情况下,如果*只运行一次正则表达式,那将实际上是一个无操作*.如果你想在一个字符串中查找多个匹配项,那么第一个^必须去. (3认同)

Dan*_*lau 15

尝试 /[^;]*/

谷歌regex character classes了解详情.


Ski*_*ick 10

尝试 /[^;]*/

这是一个否定的角色类.


Yar*_*boy 7

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

/<simpleChoice.*>/
Run Code Online (Sandbox Code Playgroud)

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

/<simpleChoice[^>]*>/
Run Code Online (Sandbox Code Playgroud)

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


小智 7

示范文本:

"this is a test sentence; to prove this regex; that is g;iven below"
Run Code Online (Sandbox Code Playgroud)

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

  • 不必转义`;`char,因为它不是正则表达式的特殊字符。也不需要对`()`进行分组。您可以使用`/.*?;/` (3认同)
  • 这是我一直在寻找的答案。所以 ?使比赛在第一次出现时结束?正则表达式的这个...(叫它)属性的名称是什么? (2认同)
  • @Parziphal '?' 字符使匹配**惰性**(匹配尽可能少的次数)。想想正则表达式匹配字符直到第一个分号,然后它不会再进一步​​,因为它放弃了(懒惰;)) (2认同)

Lon*_*zak 6

没有一个建议的答案对我有用。(例如在记事本++中)但是

^.*?(?=\;)
Run Code Online (Sandbox Code Playgroud)

做过。


gho*_*g74 5

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

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

产量

$ php test.php
match everything until first
Run Code Online (Sandbox Code Playgroud)


mch*_*hid 5

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

/^([^;]*);*/
Run Code Online (Sandbox Code Playgroud)