Как сопоставить большинство не-цифр с помощью регулярных выражений? - PullRequest
0 голосов
/ 03 апреля 2019

Я хочу заменить все нецифровые символы в строке, кроме начального знака минус (-).

Например, hu следует удалить из -123hu8 и -jk должен быть удален из 34-jk8.

Я использую следующее регулярное выражение, но оно не работает.

^[^-]|[^\d\.]

Есть что-то, что я пропускаю?

Ответы [ 4 ]

2 голосов
/ 04 апреля 2019

Потому что осмотры дорогие,

(?!^-)\D+

, вероятно, медленнее, чем

(?:^-?+|\d++)\K\D+

Я не знаю, имеет ли это значение для вас.

Тест:

>perl -e"CORE::say $ARGV[0] =~ s/(?:^-?+|\d++)\K\D+//rg;" -- -123hu8
-1238

>perl -e"CORE::say $ARGV[0] =~ s/(?:^-?+|\d++)\K\D+//rg;" -- 123hu8
1238

>perl -e"CORE::say $ARGV[0] =~ s/(?:^-?+|\d++)\K\D+//rg;" -- a123hu8
1238

>perl -e"CORE::say $ARGV[0] =~ s/(?:^-?+|\d++)\K\D+//rg;" -- -a123hu8
-1238

>perl -e"CORE::say $ARGV[0] =~ s/(?:^-?+|\d++)\K\D+//rg;" -- 34-jk8
348
1 голос
/ 03 апреля 2019

Вы можете использовать отрицательный взгляд, чтобы утверждать, что справа не начинается строка, за которой следует дефис.

Затем сопоставьте необязательный дефис, за которым следует 1+ раз, а не цифра.

(?!^-)\D+

Пояснение

  • (?!^-) Отрицательное lookahead , утверждение, что непосредственно справа, не является началом строки, за которой следуетчерез дефис
  • \D+ Совпадение 1+ раз, а не цифра

regex demo

Или для сопоставления символов слова без цифрыВы можете использовать:

(?!^-)[^\W\d]+

Последняя часть в этом шаблоне:

  • [^\W\d]+ Отрицательный класс символов , чтобы соответствовать символу слова, кроме цифр

Regex demo

0 голосов
/ 11 апреля 2019
$_='-123hu8-34-jk8'
s/[^\d-]+//g
print $_

GNU SED

echo '-123hu8-34-jk8'| sed -E 's/[^-0-9]//g'
0 голосов
/ 04 апреля 2019

У вас есть ^[^-]|[^\d\.]

Поддержка классов символов (например, \d) внутри классов не реализована в некоторых языках.Какой язык вы используете?Возможно, вам повезет больше с [^0-9\.].

У вас есть ^[^-], который соответствует любой строке, которая не начинается с -, которая включает цифры, поэтому первая цифра числа будет сдавлена.Вы хотите заменить - только тогда, когда за ним не следует цифра.

Обратите внимание, что ваше выражение соответствует только одному символу, поэтому вам нужно будет рекурсивно применить его для изменения всей строки.Или вы можете использовать «+» или «*» для сопоставления нескольких символов.Мы могли бы помочь вам лучше, если вы включите несколько строк кода, где это используется.

Концептуально было бы проще извлечь числовую часть и выбросить остальную часть строки, но это звучит какВы хотите, чтобы 34-jk8 превратился в 348.Как бы вы справились с ведущим -, таким как -jk348?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...