3

现在我已经掌握了非常基本的正则表达式技能,只对基本的东西使用了几次正则表达式。以前可能有人问过这个问题,对此我深表歉意,但我找不到任何答案。发现类似的,虽然并试图适应它,但无济于事。好的,对于这个问题 - 如何仅在某些字符之间替换空格(在这种情况下为双引号)?

假设我有以下字符串:

“任务播客”modcast ABC“DE F”

我想替换任务播客之间的空间以及DEF之间的空间,同时保持其他空间不变。

PS如果空格是字符串怎么办?一个例子也是受欢迎的。

对此进行了一些编辑,我希望现在它更清楚了。编辑 2:我需要在 php 中的字符串上执行此操作并在 shell 中执行它。编辑3:对不起,我把整个问题改了3次,只是我自己很困惑。干杯!

4

3 回答 3

2

描述

我会通过首先将字符串拆分为带引号或不带引号的字符串组来解决这个问题。

然后遍历匹配项,如果填充了捕获组 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 脚本将仅替换带引号的字符串中的空格。

工作示例:http: //ideone.com/jBytL3

代码

<?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"
于 2013-07-02T21:03:00.793 回答
0

如果您不需要使用正则表达式,这是一个有效的迭代版本:

<?php
    function remove_quoted_whitespace($str) {
        $result = '';
        $length = strlen($str);
        $index = 0;
        $in_quotes = false;

        while ($index < $length) {
            $c = $str[$index++];

            if ($c == '"') {
                $in_quotes = !$in_quotes;
            } else if ($c == ' ') {
                if ($in_quotes) {
                    continue;
                }
            }

            $result .= $c;
        }

        return $result;
    }

    $input = '"mission podcast" modcast A B C "D E F"';
    $output = remove_quoted_whitespace($input);

    echo $input . "\n";
    echo $output . "\n";
?>
于 2013-07-02T21:22:21.747 回答
0

根本不需要整个foreach!为此可以使用单线。

这是替换引号字符串中的空格的代码。这个想法是,如果空格在引号内,则后面跟着奇数个引号。它可以通过正则表达式前瞻来完成。

echo preg_replace('{\s+(?!([^"]*"[^"]*")*[^"]*$)}',"x",$str);

就这样!这个怎么运作?它匹配所有 \s 字符,这些字符后面没有偶数个引号。匹配的空格被 x 替换。您当然可以将其更改为任何所需的值或将其留空。

于 2015-10-31T21:18:32.103 回答