gpt4 book ai didi

php - 转义撇号的正则表达式条件匹配

转载 作者:可可西里 更新时间:2023-10-31 22:52:45 24 4
gpt4 key购买 nike

$str = "'ei-1395529080',0,0,1,1,'Name','email@domain.com','Sentence with \'escaped apostrophes\', which \'should\' be on one line!','no','','','yes','6.50',NULL";

preg_match_all("/(')?(.*?)(?(1)(?!\\\\)'),/s", $str.',', $values);
print_r($values);

我正在尝试编写具有这些目标的正则表达式:

  1. 返回 , 分隔值的数组(注意我在第 2 行附加到 $str)
  2. 如果数组项以 ' 开头,匹配结尾的 '
  3. 但是,如果它像 \' 一样被转义,则继续捕获该值,直到找到一个没有前面的 \'

如果您尝试这些行,它会在遇到 \', 时出现异常

任何人都可以解释发生了什么以及如何解决它吗?谢谢。

最佳答案

这就是我将如何解决这个问题:

('(?>\\.|.)*?'|[^\,]+)

Regex101

解释:

(              Start capture group
' Match an apostrophe
(?> Atomically match the following
\\. Match \ literally and then any single character
|. Or match just any single character
) Close atomic group
*?' Match previous group 0 or more times until the first '
|[^\,] OR match any character that is not a comma (,)
+ Match the previous regex [^\,] one or more times
) Close capture group

关于原子组如何工作的注释:

假设我有这个字符串 'a\' b'

原子组 (?>\\.|.) 将在每一步按以下方式匹配此字符串:

  1. '
  2. 一个
  3. \'
  4. b
  5. '

如果以后匹配失败,它将不会尝试将\'匹配为\, ' 但如果合适,将始终匹配/使用第一个选项。


如果您需要帮助转义正则表达式,这里是转义版本:('(?>\\\\.|.)*?'|[^\\,]+)


although i spent about 10 hours writing regex yesterday, i'm not too experienced with it. i've researched escaping backslashes but was confused by what i read. what's your reason for not escaping in your original answer? does it depend on different languages/platforms? ~OP

关于为什么必须在编程语言中转义正则表达式的部分。

当你写下下面的字符串时:

"This is on one line.\nThis is on another line."

您的程序将按字面解释 \n 并按以下方式查看它:

"This is on one line.
This is on another line."

在正则表达式中,这可能会导致问题。假设您想匹配所有不是换行符的字符。这就是您要这样做的方式:

"[^\n]*"

但是,\n 在用编程语言编写时按字面解释,将按以下方式显示:

"[^
]*"

我相信你可以看出,这是错误的。因此,为了解决这个问题,我们转义 字符串。通过在第一个反斜杠前面放置一个反斜杠 when 可以告诉编程语言以不同的方式查看 \n(或任何其他转义序列:\r\t\\ 等)。在基本层面上,转义将原始转义序列 \n 换成另一个转义序列,然后是字符 \\n。这就是转义如何影响上面的正则表达式。

"[^\\n]*"

编程语言的处理方式如下:

"[^\n]*"

这是因为 \\ 是一个转义序列,意思是“当您看到 \\ 时,将其按字面解释为 \”。因为 \\ 已经被使用和解释,下一个要读取的字符是 n ,因此不再是转义序列的一部分。

那么为什么我的转义版本中有 4 个反斜杠?让我们来看看:

(?>\\.|.)

所以这是我们写的原始正则表达式。我们有两个连续的反斜杠。正则表达式的这一部分 (\\.) 意思是“只要你看到一个反斜杠,然后是任何字符,就匹配”。为了保留正则表达式引擎的这种解释,我们必须转义每个单独的反斜杠。

\\ \\ .

所以整体看起来像这样:

(?>\\\\.|.)

关于php - 转义撇号的正则表达式条件匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34215312/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com