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

Posted

技术标签:

【中文标题】正则表达式:匹配字符的第一次出现【英文标题】:Regex: matching up to the first occurrence of a character 【发布时间】:2011-01-02 01:22:20 【问题描述】:

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

这是我写的:

/^(.*);/

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

【问题讨论】:

/^(.*?);/ 也应该可以工作(它被称为 non-greedy),但是使用[^;]* 给出的答案更好。 如何选择分号之后的所有内容,而不是分号本身。 看到这个作品\w+(?!([^]+;)|;) 但这不是为什么? .+(?!([^]+;)|;) 帕斯卡,你应该把它写成答案! 【参考方案1】:

试试/[^;]*/

谷歌regex character classes了解详情。

【讨论】:

【参考方案2】:

/^[^;]*/

[^;] 表示匹配除分号以外的任何内容。方括号是一个集合匹配运算符,它本质上是匹配这组字符中的任何字符,开头的^ 使其成为反向匹配,因此匹配该集合中的任何not

【讨论】:

请注意,此答案中的第一个 ^ 赋予正则表达式完全不同的含义:它使正则表达式仅查找从字符串开头开始的匹配项。在这种情况下,这实际上是一个无操作 if 您只运行一次正则表达式。如果您想在单个字符串中查找多个匹配项,则必须删除第一个 ^。 他确实说过他想匹配所有内容,直到第一次出现分号,所以我假设他的意思是从字符串的开头。【参考方案3】:

试试/[^;]*/

这是一个否定的character class。

【讨论】:

【参考方案4】:

你需要

/[^;]*/

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

引用perlre 联机帮助页:

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

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

【讨论】:

这个解决方案的重要之处在于它也匹配行尾,例如在我的情况下,我有 foo=bar;baz=bax;bab=baf 并且它匹配 bab=baf 即使没有 ; 正是我需要的。如果规范说除了目标符号之外的所有内容都匹配,但不确定它为什么会起作用......【参考方案5】:

会;

/^(.*?);/

工作?

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

【讨论】:

是的,但是随着对 Tim Toady 的碳酸氢盐扩展,我相信否定字符类会获胜,因为惰性量词包括回溯。无论如何 +1。 性能话题值得一读:blog.stevenlevithan.com/archives/greedy-lazy-performance【参考方案6】:

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

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

输出

$ php test.php
match everything until first

【讨论】:

【参考方案7】:

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

/<simpleChoice.*>/

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

/<simpleChoice[^>]*>/

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

【讨论】:

我发现实际解析 html/xml(每种语言或框架都有自己的类)效率更高,因为它是机器格式,正则表达式适用于自然语言。 不错。我用它来修复 &lt;!DOCTYPE&gt; 标记中存在语法错误的 xml 文档。由于解析器无法处理它。【参考方案8】:

示例文本:

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

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

【讨论】:

不需要转义; char,因为它不是正则表达式特殊字符。也不需要分组()。你可以用/.*?;/ 是的,你说的很对。逃跑更像是“比后悔更安全” 这是我一直在寻找的答案。所以 ?让比赛在第一次出现时结束?正则表达式的这个...(我们称之为)属性的名称是什么? @Parziphal ? 字符使匹配惰性(匹配尽可能少)。想想正则表达式匹配字符直到第一个分号然后它不会走得更远,因为它放弃了(懒惰;))【参考方案9】:

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

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

【讨论】:

【参考方案10】:

没有人给你正确的答案真的有点遗憾....

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

只需添加一个 ?并且它将是非贪婪的并且尽可能少地匹配!

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

【讨论】:

这在很大程度上取决于实际的正则表达式实现,并不是每个实现都有非贪婪模式。【参考方案11】:

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

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

【讨论】:

【参考方案12】:

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

^.*?(?=\;)

做了。

【讨论】:

对我来说,这符合角色的所有内容,但不包括。 是的,完全正确:-)(因为这是被问到的。) 这是唯一适用于我的情况的答案,非常感谢!

以上是关于正则表达式:匹配字符的第一次出现的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式(regex)

仅匹配指定字符的最后一次出现的正则表达式

正则表达式

Python正则表达式详解

正则表达式在匹配字符串之后查找最大数字的最后一次出现

正则表达式