Как я могу удалить все токены с несловесными символами в Perl? - PullRequest
3 голосов
/ 03 апреля 2009

Я пытаюсь найти регулярное выражение для удаления всех слов, которые содержат несловесные символы.

Так что, если он содержит двоеточие, запятую, число, скобки и т. Д., То удалите его из строки, не только символ, но слово. У меня есть это до сих пор.

$wordline = s/\s.*\W.*?\s//g;

Не обязательно быть идеальным, поэтому удаление строк с дефисом и апострофом можно.

Ответы [ 3 ]

3 голосов
/ 03 апреля 2009
$wordline = join(" ", grep(/^\w+$/, split(/\s+/, $wordline)));
2 голосов
/ 03 апреля 2009
s/(?<!\S)(?![A-Za-z]+(?:\s|$))\S+(?!\S)//g

В регулярном выражении «символ слова» представляет собой букву, цифру или знак подчеркивания ([A-Za-z0-9_]). Похоже, вы используете его для обозначения букв, поэтому \w и \W не принесут вам пользы. Мои регулярные выражения:

  • набор непробельных символов: \S+

  • не предшествует: (?<!\S) или сопровождается: (?!\S) непробельными символами

  • , если все символы не являются буквами: (?![A-Za-z]+(?:\s|$))

Это оставит позади все пробелы вокруг слов, которые он удаляет. Справиться с этим правильно немного сложнее, чем вы могли бы ожидать; это намного проще сделать в отдельном шаге, например:

s/^ +| +(?= |$)//g
2 голосов
/ 03 апреля 2009
s/\w*([^\w\s]|\d)+\w* ?//g;
...