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