现在我掌握了非常基本的正则表达式技能,只用了几次正则表达式来处理基本的东西。之前可能有人问过这个问题,对此我深表歉意,但我找不到任何答案。发现类似的,虽然并试图适应它但无济于事。 好的,回到问题 - 如何仅替换某些字符(在本例中为双引号)之间的空格?
假设我有以下字符串:
"mission podcast" modcast A B C "D E F"
我想替换mission和podcast之间的空格以及D、E之间的空格& F 同时保持其他不变。
附言如果空间是一个字符串怎么办?也欢迎举个例子。
对此进行了一些编辑,我希望它现在更清楚了。 编辑 2:我需要在 php 中的字符串上执行此操作并在 shell 中执行它。 编辑 3:对不起,我把整个问题改了 3 次,只是我自己很困惑。干杯!
最佳答案
描述
我会通过首先将字符串分成多组带引号或不带引号的字符串来解决这个问题。
然后遍历匹配项,如果捕获组 1 已填充,则该字符串被引用,因此只需对替换捕获组 0 进行简单替换。如果捕获组 1 未填充,则跳至下一个匹配项。
在每次迭代中,您只想构建一个新字符串。
因为分割字符串是困难的部分,我会使用这个正则表达式:
("[^"]*")|[^"]*
例子
示例文本
"mission podcast" modcast A B C "D E F"
代码
PHP Code Example:
<?php
$sourcestring="your source string";
preg_match_all('/("[^"]*")|[^"]*/i',$sourcestring,$matches);
echo "<pre>".print_r($matches,true);
?>
捕获组
$matches Array:
(
[0] => Array
(
[0] => "mission podcast"
[1] => modcast A B C
[2] => "D E F"
[3] =>
)
[1] => Array
(
[0] => "mission podcast"
[1] =>
[2] => "D E F"
[3] =>
)
)
PHP 示例
此 php 脚本将仅替换带引号的字符串中的空格。
代码
<?php
$text ='"mission podcast" modcast A B C "D E F"';
preg_match_all('/("[^"]*")|[^"]*/',$text,$matches);
foreach($matches[0] as $entry){
echo preg_replace('/\s(?=.*?")/ims','~~new~~',$entry);
}
输出
"mission~~new~~podcast" modcast A B C "D~~new~~E~~new~~F"
关于php - 替换 php 正则表达式中引号之间的部分字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17431820/