Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 如何捕获组并在捕获中排除单词?_Regex - Fatal编程技术网

Regex 如何捕获组并在捕获中排除单词?

Regex 如何捕获组并在捕获中排除单词?,regex,Regex,例如: Book=包含全文的字符串 startChar=开始捕获的位置=| endChar=应该结束捕获的位置=§ 捕获中要忽略的单词=灰色 因此,如果不是灰色这个词,我的捕获将是一个简单的:|.+§ 以下是我的意思的一个例子: 灰色的狐狸是如此的灰色以至于它是相当的灰色 捕获=因此它很漂亮 使用C和PHP,但我不想使用任何替换函数,我只想要一个纯正则表达式。您可以在全局搜索中使用此模式: (?:\G(?!\A)|\|)(?:\bgray\b)?\K((?:(?!\bgray\b)[^§])+)

例如: Book=包含全文的字符串

startChar=开始捕获的位置=|

endChar=应该结束捕获的位置=§

捕获中要忽略的单词=灰色

因此,如果不是灰色这个词,我的捕获将是一个简单的:|.+§

以下是我的意思的一个例子:

灰色的狐狸是如此的灰色以至于它是相当的灰色

捕获=因此它很漂亮


使用C和PHP,但我不想使用任何替换函数,我只想要一个纯正则表达式。

您可以在全局搜索中使用此模式:

(?:\G(?!\A)|\|)(?:\bgray\b)?\K((?:(?!\bgray\b)[^§])+)(?=(?:gray)?(§)?)
细节

注意:此子模式是一个众所周知的技巧,用于匹配避免单词的文本。但是,这个子模式速度很慢,特别是对于需要避免的单词很少的长文本。 它可以替换为:?>[^g§]+\Bg | g?!ray\b+可能更快,但不太容易以编程方式构建

使用PHP的示例:

$book = "The gray fox is |so gray that its pretty gray§.";

$reg = '~(?:\G(?!\A)|\|)(?:\bgray\b)?\K((?:(?!\bgray\b)[^§])+)(?=(?:gray)?(§)?)~';

if ( preg_match_all($reg, $book, $matches) && !empty(end($matches[2])) )
    echo implode('', $matches[1]);

注意:最后一个捕获组仅用于确保已到达终点。如果条件检查它与!emptyend$matches[2]

使用正则表达式查找句子,在/gr[ae]y/上拆分并连接结果片段。您使用的是什么工具或语言?您希望用哪种语言实现此功能?根据这一点,您还可以使用replace函数,它在大多数语言中都接受regex和占位符/替换序列?对于上面的示例,您的预期输出是什么?Text=是否包含在输入字符串中?问题是,句子是一个变量,因此灰色可能出现在该句子的任何位置,我所要定义的捕获点是一个起始字符和一个结束字符。因此,如果不是灰色这个词,我的答案很简单:startChar1.+endchar1谢谢你完整地回答了我的问题。
$book = "The gray fox is |so gray that its pretty gray§.";

$reg = '~(?:\G(?!\A)|\|)(?:\bgray\b)?\K((?:(?!\bgray\b)[^§])+)(?=(?:gray)?(§)?)~';

if ( preg_match_all($reg, $book, $matches) && !empty(end($matches[2])) )
    echo implode('', $matches[1]);