替换括号之间的特定字符
Replace specific character inbetween brackets
我想将 ,
替换为位于 []
之间的 :
个字符。
所以 [Hello, as] a, booby
会变成 [Hello: as] a, booby
。我不知道如何匹配括号内的逗号,我可以将括号内的单词与
\[(.*)\]
但我不知道如何从那里选择逗号。
此外,如果我得到 [[Hello, as] a, booby]
,那么我也只想更改第一个逗号。我尝试使用 *
或 +
但它不起作用。
我需要这个
[["Sender", "mail@text.org"], ["Date", "Fri, 09 Jun 2017 13:29:22 +0000"]]
变成这样
[["Sender": "mail@text.org"], ["Date": "Fri, 09 Jun 2017 13:29:22 +0000"]]
我想使用 preg_replace 但我认为这不是正确的解决方案。
preg_replace("/(\[[^],]*),/U" , ':', $arr)
returns
": mail@text.org"], : "Fri, 09 Jun 2017 13:29:22 +0000"]
尝试将逗号前后的所有内容分组,然后将它们放回冒号周围。
preg_replace('/(\[.*?),(.*?\])/',':',$string)
您可以使用基于 \G
的模式:
$str = preg_replace('~(?:\G(?!\A)|\[(?=[^][]*]))[^][,]*\K,~', ':', $str);
这种模式以交替的 2 个子模式开始:
\[(?=[^][]*])
搜索 [
后跟 ]
,它们之间没有其他括号。
\G(?!\A)
在前一个匹配后的位置匹配
然后,在这两种情况下[^][,]*\K,
到达下一个只能在[
和]
之间的,
。
但是由于您还需要跳过双引号之间的逗号,因此您必须在最终逗号之前匹配双引号部分。为此,将 [^][,]*
更改为 [^][",]*(?:"[^"\]*(?s:\.[^"\]*)*"[^][",]*)*+
$str = preg_replace('~(?:\G(?!\A)|\[(?=[^][]*]))[^][",]*+(?:"[^"\\]*(?s:\\.[^"\\]*)*"[^][",]*)*+\K,~', ':', $str);
这看起来很简单:(Demo Link)
(?<="),
它对您的嵌套伪数组值做了一些假设。
PHP 实施:
$in='[["Sender", "mail@text.org"], ["Date", "Fri, 09 Jun 2017 13:29:22 +0000"], ["Name", "Dude"]]';
echo preg_replace('/(?<="),/',':',$in);
输出:
[["Sender": "mail@text.org"], ["Date": "Fri, 09 Jun 2017 13:29:22 +0000"], ["Name": "Dude"]]
如果这不适合您的实际字符串,请提供我的模式失败的字符串,以便我进行调整。扩展模式以确保逗号跟在引用的 "key" 之后,可以这样做:"[^"]+"\K,
...步长成本略高(但仍然不错)。
我想将 ,
替换为位于 []
之间的 :
个字符。
所以 [Hello, as] a, booby
会变成 [Hello: as] a, booby
。我不知道如何匹配括号内的逗号,我可以将括号内的单词与
\[(.*)\]
但我不知道如何从那里选择逗号。
此外,如果我得到 [[Hello, as] a, booby]
,那么我也只想更改第一个逗号。我尝试使用 *
或 +
但它不起作用。
我需要这个
[["Sender", "mail@text.org"], ["Date", "Fri, 09 Jun 2017 13:29:22 +0000"]]
变成这样
[["Sender": "mail@text.org"], ["Date": "Fri, 09 Jun 2017 13:29:22 +0000"]]
我想使用 preg_replace 但我认为这不是正确的解决方案。
preg_replace("/(\[[^],]*),/U" , ':', $arr)
returns
": mail@text.org"], : "Fri, 09 Jun 2017 13:29:22 +0000"]
尝试将逗号前后的所有内容分组,然后将它们放回冒号周围。
preg_replace('/(\[.*?),(.*?\])/',':',$string)
您可以使用基于 \G
的模式:
$str = preg_replace('~(?:\G(?!\A)|\[(?=[^][]*]))[^][,]*\K,~', ':', $str);
这种模式以交替的 2 个子模式开始:
\[(?=[^][]*])
搜索[
后跟]
,它们之间没有其他括号。\G(?!\A)
在前一个匹配后的位置匹配
然后,在这两种情况下[^][,]*\K,
到达下一个只能在[
和]
之间的,
。
但是由于您还需要跳过双引号之间的逗号,因此您必须在最终逗号之前匹配双引号部分。为此,将 [^][,]*
更改为 [^][",]*(?:"[^"\]*(?s:\.[^"\]*)*"[^][",]*)*+
$str = preg_replace('~(?:\G(?!\A)|\[(?=[^][]*]))[^][",]*+(?:"[^"\\]*(?s:\\.[^"\\]*)*"[^][",]*)*+\K,~', ':', $str);
这看起来很简单:(Demo Link)
(?<="),
它对您的嵌套伪数组值做了一些假设。
PHP 实施:
$in='[["Sender", "mail@text.org"], ["Date", "Fri, 09 Jun 2017 13:29:22 +0000"], ["Name", "Dude"]]';
echo preg_replace('/(?<="),/',':',$in);
输出:
[["Sender": "mail@text.org"], ["Date": "Fri, 09 Jun 2017 13:29:22 +0000"], ["Name": "Dude"]]
如果这不适合您的实际字符串,请提供我的模式失败的字符串,以便我进行调整。扩展模式以确保逗号跟在引用的 "key" 之后,可以这样做:"[^"]+"\K,
...步长成本略高(但仍然不错)。