Regex (Java), чтобы удалить все символы до, но не включая (число или буква a-f, за которыми следует число) - PullRequest
1 голос
/ 09 марта 2011

Мне нужна помощь в построении регулярного выражения для удаления всех символов до, но не включая (число или буква a-f, за которыми следует число) в Java:

Вот что я придумал (не работает): string.replaceFirst(".+?(\\d|[a-f]\\d)","");

Эта строка кода заменяет всю строку пустой строкой. .+? - это каждый символ до \\d цифры ИЛИ [a-f]\\d любая из букв a-f, за которой следует цифра.

Однако это не работает, можно мне помочь?

Спасибо

РЕДАКТИРОВАТЬ: изменено replace с replaceFirst

Ответы [ 4 ]

2 голосов
/ 09 марта 2011

Я бы предложил что-то вроде

string.replaceFirst(".*?(?=(\\d|[a-f]\\d))", "");
2 голосов
/ 10 марта 2011

Другие ответы, приведенные здесь, имеют проблему, заключающуюся в том, что если строка начинается с af, за которым следует число или просто число, они фактически будут совпадать и заменять первый символ.Не уверен, что это актуальный сценарий.Этот более запутанный шаблон должен работать, хотя:

"([^a-f\\d]|([a-f](?!\\d)))+"

(то есть все, что не является цифрой или af, или af, за которым не следует цифра).

2 голосов
/ 09 марта 2011

Во-первых, replace() действует на литералы, а не на регулярные выражения.Вы должны использовать replaceFirst или replaceAll в зависимости от того, что вы хотите.Ваша проблема с регулярным выражением в том, что вы включаете суффикс в качестве части строки для замены.Вы можете попробовать:

input.replaceFirst(".+?(\\d|[a-f]\\d)","$1")

Здесь я просто включаю суффикс в строку замены.Более правильный подход состоит в том, чтобы сделать это утверждение нулевой ширины, чтобы оно не включалось в область для замены.Вы можете использовать позитивный взгляд:

input.replaceFirst(".+?(?=(\\d|[a-f]\\d))", "")
1 голос
/ 10 марта 2011
s = s.replaceFirst(".*?(?=[a-f]?\\d)", "");

Использование .*? вместо .+? гарантирует, что первый символ будет проверен прогнозистом, решая проблему, упомянутую @johusman.И хотя ваш (\\d|[a-f]\\d) не вызывает проблем, [a-f]?\\d более эффективен и удобочитаем.

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