2013-10-09 4 views
0

Я настраиваю систему для синтаксического анализа строки с очень указанным синтаксисом и исправления ошибок пользователя. Например, синтаксис требует даты в формате уу (без ведущих 0s) ч/д /, так что мне нужно сделать следующие замены:Intelligent RegEx Замена

  • 10/01/13 -> 10/1/13
  • 10/10/13 -> Без изменений
  • 10/1/13 -> без изменений
  • 01/10/13 -> 1/10/13

у меня есть много правил, как это по которой мне нужно найти порции строки и исправить эти части. Я могу использовать RegEx для определения того, что нужно легко исправлять. Для более легкого примера, я хочу найти CBUx[2-9], но тогда мне нужно заменить что-то вроде этого CBU x [2-9] (пробелы вокруг x, если ему предшествует CBU и обозначается цифрой). Пример:

ввод текст: "ла CBUx3" совпадения: "CBUx3" заменить: "ЦБ х 3" выходного текст: "ли ЦБ х 3"

Возможно ли это? Обратите внимание, что я полностью знаю, что могу написать код, чтобы найти косые черты и цифры. Я специально пытаюсь сделать это с помощью «замены RegEx Registry». У меня есть много разных типов исправлений, которые я могу сопоставить с RegEx, и я хотел бы избежать написания конкретных процедур коррекции для каждого.

+1

Что вы подразумеваете под интеллектуальным регулярным выражением? Вы хотите, чтобы вы объединили все правила в одном регулярном выражении? ** P.S. ** Я считаю, что хорошо написанное регулярное выражение всегда разумно! – jkshah

+1

На каком языке вы используете? Кстати, любая система, которая думает, что m/d/yyyy «умна», вероятно, уже в беде. Лучше конвертировать из приходского, причудливого формата m/d/yyyy, используемого только в одной стране, в ISO yyyy/mm/dd или dd/mm/yyyy, как используется в остальном мире – Bohemian

+0

«Интеллектуальный» изменяет замену , а не регулярное выражение. Дело в том, что я хочу, чтобы указать строку замены с помощью регулярного выражения. Отсюда и мои примеры. Независимо от того, нравится ли вам формат даты, который я вынужден использовать в этом экземпляре (я предпочитаю ISO), совершенно не имеет значения. –

ответ

0

Может быть что-то подобное для ведущих нулей:

\b0+([1-9]) 

И заменить $1 (или \1 в зависимости от языка, хотя \1 менее распространена в настоящее время).

Но что-то немного лучше может быть с использованием отрицательного просмотра назад:

(?<![.,])\b0+([1-9]) 

Так что 0 в 10,001.002 не изменяются в 10,1.2.

regex101 demo

Граница слова, \b, убеждается, что 0 (или больше) в начале номера и отрицательного просмотра назад для случаев знаков после запятой и тысячи сепараторов, при условии, что у вас есть есть плавающий числа в строке. Обратите внимание, что это, однако, предотвратит удаление нулей в формате даты 11.01.13. Однако более сложное регулярное выражение может быть сделано с предположением, что такая дата всегда имеет по меньшей мере одно число после второй точки (сама по себе после двух чисел, поскольку даты и месяцы занимают не более 2 цифр), не встречая ничего, кроме других чисел, что делает регулярное выражение выглядеть ...

(?<![.,](?![0-9]{2}\.[0-9]))\b0+([1-9]) 

И что делает что-то вроде this.


Для CBUx[2-9], вы можете использовать захват группы, а также:

CBUx([2-9]) 

И заменить: CBU x $1 (или \1)


Там могут быть некоторые твики я Бесполезный Не рассматривайте лидирующую часть удаления, но об этом я могу сейчас подумать.

+0

Спасибо - документация, которую я видел при группировке с() и заменой на $, была не очень ясной (или, по крайней мере, не так для новичков Regex). Вы не только ответили на мой ближайший вопрос, но теперь я понимаю основную логику! –

+0

@ Dr.Drew Добро пожаловать! Если вам нужно больше разъяснений, дайте мне знать, и я постараюсь объяснить как можно больше :) – Jerry