正则表达式 最小匹配(第一次出现) 2020-10-01
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了正则表达式 最小匹配(第一次出现) 2020-10-01相关的知识,希望对你有一定的参考价值。
参考技术A
⮮因为需要使用Notepad++ 来过滤一些字符如下:
⮮首先按照字面的特征,写正则表达式如下:
\\[.*\\]\\(https:.+\\) ,测试匹配
⮮查阅Notepad++的在线帮助,找到正则表达式的相关内容:
When regex “.*” is run against the text “abc”x :
When regex “.*+” , with a possessive quantifier, is run against the text “abc”x :
Notice there is no match at all for the possive version, because the possessive repeat factor prevents from backtracking to a possible solution
⮮注意关键说明如下:
加入 *? 表示前一个字符出现0次或者无限多次,但是是 最小匹配 。结合刚才的需求分析:
⮮运行结果如下:
为什么呢?仔细分析正则表达式,原来问题出现在了前面:
前面的这个 \\[.*\\] 没有进行限定,依然是最大匹配,现在在这里也加上 ? ,看测试结果:
正则表达式:匹配字符的第一次出现
【中文标题】正则表达式:匹配字符的第一次出现【英文标题】: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(每种语言或框架都有自己的类)效率更高,因为它是机器格式,正则表达式适用于自然语言。 不错。我用它来修复<!DOCTYPE>
标记中存在语法错误的 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】:没有一个建议的答案对我有用。 (例如在记事本++中) 但是
^.*?(?=\;)
做了。
【讨论】:
对我来说,这符合角色的所有内容,但不包括。 是的,完全正确:-)(因为这是被问到的。) 这是唯一适用于我的情况的答案,非常感谢!以上是关于正则表达式 最小匹配(第一次出现) 2020-10-01的主要内容,如果未能解决你的问题,请参考以下文章