Php Regex替换特定标记中出现的所有单个字符

Php Regex替换特定标记中出现的所有单个字符,php,regex,Php,Regex,我想知道是否可以使用一组正则表达式搜索/替换模式来替换包含在2个标记中的字符串中的特定字符的所有出现 例如,是否可以将所有句点替换为标记1和标记2之间的文本空格,如下面的示例所示 以便: TOKEN1:Run.Spot.run:TOKEN2 更改为: TOKEN1:Run Spot run:TOKEN2 注意:正则表达式需要能够替换任何文本中任意数量的句点,而不仅仅是上面的特定模式 我问这个问题更多是为了了解我的个人知识,因为这是我在过去多次想用各种regex实现来做的事情。然而,在这种特殊

我想知道是否可以使用一组正则表达式搜索/替换模式来替换包含在2个标记中的字符串中的特定字符的所有出现

例如,是否可以将所有句点替换为标记1和标记2之间的文本空格,如下面的示例所示

以便:

TOKEN1:Run.Spot.run:TOKEN2
更改为:

TOKEN1:Run Spot run:TOKEN2
注意:正则表达式需要能够替换任何文本中任意数量的句点,而不仅仅是上面的特定模式

我问这个问题更多是为了了解我的个人知识,因为这是我在过去多次想用各种regex实现来做的事情。然而,在这种特殊情况下,正则表达式将使用php

我对php解决方案不感兴趣,因为我知道如何做到这一点。我正在努力扩展我对正则表达式的知识

感谢您提供了这样一种方法:

$pattern = '~(?:TOKEN1:|\G(?<!^))(?:[^:.]+|:(?!TOKEN2))*\K\.~';
$replacement = ' ';
$subject = 'TOKEN1:Run.Spot.run:TOKEN2';
$result = preg_replace($pattern, $replacement, $subject);
$pattern='~(?:TOKEN1:|\G(?一种方法:

$pattern = '~(?:TOKEN1:|\G(?<!^))(?:[^:.]+|:(?!TOKEN2))*\K\.~';
$replacement = ' ';
$subject = 'TOKEN1:Run.Spot.run:TOKEN2';
$result = preg_replace($pattern, $replacement, $subject);

$pattern='~(?:TOKEN1:|\G(?我认为最好的方法是编写如下内容:

$result =
    preg_replace_callback(
        '/(TOKEN1:)([^:]+)(:TOKEN2)/g',
        function ($matches) {
            return $matches[0]
                   . preg_replace('/[.]/g', ' ', $matches[1])
                   . $matches[2];
        },
        'TOKEN1:Run.Spot.run:TOKEN2'
    );

(免责声明:未经测试。)

我认为最好的方法是这样写:

$result =
    preg_replace_callback(
        '/(TOKEN1:)([^:]+)(:TOKEN2)/g',
        function ($matches) {
            return $matches[0]
                   . preg_replace('/[.]/g', ' ', $matches[1])
                   . $matches[2];
        },
        'TOKEN1:Run.Spot.run:TOKEN2'
    );

(免责声明:未经测试。)

最简单的做法是,您需要一个转义(
\
)句点(因为句点通常匹配任何字符)作为模式:
\.
,并将其替换为空格:

这将用
替换
的所有实例

但是,从您的评论来看,您似乎要求用正则表达式替换单词字符之间的所有句点:

(?<=\w)\.(?=\w)

如果句点出现在开始标记之后和/或结束标记之前,并且您不想替换它们,那么您可能需要对其进行优化。

最简单的情况是,您需要一个转义(
\
)句点(因为句点通常匹配任何字符)作为您的模式:
\.
,并将其替换为一个空格:

这将用
替换
的所有实例

但是,从您的评论来看,您似乎要求用正则表达式替换单词字符之间的所有句点:

(?<=\w)\.(?=\w)

如果句点可能出现在开始标记之后和/或结束标记之前,并且您不想替换它们,那么您可能需要对其进行优化。

首先。接下来,如果您没有嵌套标记或任何有趣的东西,那么使用反向引用应该相当容易。是否有任何类型的嵌套?谢谢。这对您来说可能很容易但我还没找到解决办法我不是在解析HTML。我只是编了一个选择不当的示例。我已将问题编辑为更一般的问题。标记内没有任何问题,例如嵌套等。只有简单的字符、数字、句点,可能还有连字符。我知道如何在不需要包装标记的情况下替换句点。但我没有我们能够找出任何只对标记内的文本有效的东西。没有“regex语句”或“能够替换”的正则表达式一些东西。正则表达式是搜索和匹配的符号。字符串替换机制通常使用正则表达式,但它们的工作方式有很多不同。首先。其次,如果您没有嵌套标记或任何有趣的东西,那么使用反向引用应该相当容易。是否有任何类型的嵌套?谢谢。这对您来说可能很容易,但我有我一点运气都没有弄明白我不是在解析HTML。我只是编了一个选择不当的示例。我已将问题编辑为更一般的问题。标记内没有任何问题,例如嵌套等。只有简单的字符、数字、句点,可能还有连字符。我知道如何在不需要包装标记的情况下替换句点。但我没有我们能够找出任何只对标记内的文本有效的东西。没有“regex语句”或“能够替换”的正则表达式一些东西。正则表达式是搜索和匹配的符号。字符串替换机制通常使用正则表达式,但它们的工作方式有很多不同。你确定这会起作用吗,我用
TOKEN1:Run.Spot.Run:HELLO
尝试过,但它还是替换了点。@Sniffer:是的,我知道,默认行为类似于html标记(在关闭之前,它始终处于打开状态)你是对的,我发现这里的
\G
的用法是个好主意。如果你之前匹配过,那么从你离开的时候开始,我们肯定首先匹配了
令牌1
。底线:好主意+1。回答很好,Casimir!非常感谢!你确定这会奏效吗,我用
令牌1:Run.Spot.Run:HELLO
不管怎样,它还是替换了点。@Sniffer:是的,我知道,默认行为就像一个html标记(它总是打开直到关闭)你是对的,我发现这里使用
\G
是一个好主意。如果你之前匹配过,那么从你离开之前开始,那么我们肯定首先匹配了
标记1
。底线:好主意+1。回答很好,Casimir!非常感谢!PHP不支持可变宽度查找,或者这很简单。没有当我回答这个问题时,PHP标记在问题上。太多的正则表达式实现对lookbehinds有限制。PHP不支持可变宽度lookbehind,或者这将很简单。当我回答这个问题时,没有PHP标记。太多的正则表达式实现对lookbehinds有限制。