Как сопоставить и заменить несловесные символы между символами слов с помощью RegEx? - PullRequest
0 голосов
/ 05 августа 2009

Я работаю с набором данных, который необходимо очистить. Я ищу заменить вопросительные знаки (?) На код em-dash (—). Вот пример строки:

"... выключите его? После того, как примете пару ..."

Я могу сопоставить этот экземпляр с этим выражением: \ w \? \ W Однако, оно соответствует одному символу по обе стороны от знака вопроса. Таким образом, замена выглядит так:

"... заткнись до конца — после взятия пары ..."

Как мне сопоставить только шаблон, заменяя только знак вопроса?

Заранее спасибо, Jason

Ответы [ 4 ]

3 голосов
/ 05 августа 2009

Если используемый вами язык поддерживает lookarounds , вы можете использовать их, чтобы удостовериться, что ваш знак вопроса окружен символами слова, но на самом деле их не захватывает:

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

(?<=\w) - это взгляд назад (двигатель смотрит "сзади" - перед - потенциальным совпадением), а (?=\w) - это взгляд вперед (двигатель смотрит в будущее). Lookarounds не фиксируются, поэтому в вашем случае будет только знак вопроса, и тогда вы сможете заменить его.

Например, в 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...

Lookarounds поддерживаются механизмами регулярных выражений на основе PCRE (совместимых с perl), хотя Ruby не поддерживает lookbehinds.

3 голосов
/ 05 августа 2009

Если это PHP (я основываюсь на других вопросах, которые вы задавали), это должно сделать это:

$str = preg_replace('/(\w)\?(\w)/i', '\\1&mdash;\\2', $str);
2 голосов
/ 05 августа 2009

Использование: / \ Ь \? \ Ь /

\ b соответствует границам слов, что похоже на то, что вы ищете.

2 голосов
/ 05 августа 2009

Трудно ответить, если мы не знаем, какую технологию вы используете. Если вы пишете JS, это будет сделано

inputStr.replace(/(\w)\?(\w)/, '$1&mdash;$2');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...