如何使用RegEx匹配和替换单词字符之间的非单词字符?

时间:2009-08-05 18:09:43

标签: regex

我正在使用需要清理的数据集。我希望用em-dash代码(—)替换问号(?)。这是一个示例字符串:

“......把它关了?服用了几个......”

我可以将该实例与此表达式匹配:\ w \?\ w但是,它匹配问号两侧的一个字符。所以替换看起来像这样:

“......在服用几个......之后关闭它—。”

如何仅在替换问号时匹配模式?

提前致谢, 杰森

4 个答案:

答案 0 :(得分:3)

如果它是PHP(我基于你提出的其他问题),那应该这样做:

$str = preg_replace('/(\w)\?(\w)/i', '\\1—\\2', $str);

答案 1 :(得分:3)

如果您使用的语言支持lookarounds,您可以使用它们来确保您的问号被单词字符包围,但实际上并未捕获它们:

/(?<=\w)\?(?=\w)/

(?<=\w)是一个后视(引擎看起来“落后” - 之前 - 潜在的匹配)而(?=\w)是一个前瞻(引擎向前看)。未捕获外观,因此在您的情况下,只会出现问号,然后您可以替换它。

例如,在PHP中,您可以这样做:

$string = "...shut it down?after taking a couple of..."
preg_replace('/(?<=\w)\?(?=\w)/', "&mdash;", $string);
// results in ...shut it down&mdash;after taking a couple of...

基于PCRE(perl兼容)的正则表达式引擎支持Lookarounds,尽管Ruby不支持lookbehinds。

答案 2 :(得分:2)

如果我们不知道您使用的是哪种技术,很难回答。如果你正在编写一个JS,那就可以了。

inputStr.replace(/(\w)\?(\w)/, '$1&mdash;$2');

答案 3 :(得分:2)

使用:     / \ B \?\ B /

\ b匹配单词边界,这似乎是你所追求的。