ChatGPT解决这个技术问题 Extra ChatGPT

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

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

我写了这个:

/^(.*);/

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

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

s
sleske

你需要

/^[^;]*/

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

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

要引用 perlre 联机帮助页:

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

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


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

将;

/^(.*?);/

工作?

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


是的,但是随着对 Tim Toady 的碳酸氢盐扩展,我相信否定字符类会获胜,因为惰性量词包括回溯。无论如何+1。
G
Glenn Slaven

/^[^;]*/

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


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

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

^.*?(?=\;)

做过。


D
Dan Breslau

试试/[^;]*/

谷歌regex character classes了解详情。


S
Skilldrick

试试/[^;]*/

这是一个否定的character class


A
Aliaksei Kliuchnikau

示例文本:

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

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


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

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

/<simpleChoice.*>/

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

/<simpleChoice[^>]*>/

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


我发现实际解析(每种语言或框架都有自己的类)html/xml 因为它是机器格式,正则表达式用于自然语言,所以效率更高。
好的。我用它来修复 <!DOCTYPE> 标记中有语法错误的 xml 文档。由于解析器无法处理它。
g
ghostdog74

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

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

输出

$ php test.php
match everything until first

m
mchid

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

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

s
sPooKee

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

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

L
L1amm

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

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

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

祝你好运,希望有帮助。


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

这适用于从行首到第一个单词获取内容,

/^.*?([^\s]+)/gm

E
Ethan

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

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