Выделить список с помощью регулярных выражений? - PullRequest
0 голосов
/ 13 декабря 2011

У меня есть файл CSV, который был сгенерирован системой.Проблема в одном из полей, которое раньше было списком элементов.Пример исходного списка приведен ниже ....

The serial number of the desk is 45TYTU
This is the second item in the list
The colour of the apple is green
The ID code is 489RUI
This is the fourth item in the list.

И, к сожалению, система выкладывает код ниже .....

The serial number of the desk is 45TYTUThis is the second item in the listThe colour of the apple is greenThe ID code is 489RUIThis is the fourth item in the list.

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

Мой оригинальный вариант - попытатьсяопределить, когда буква верхнего регистра находится в середине слова в нижнем регистре, но, как и в одном из пунктов в примере, когда используется серийный номер, он выбрасывает это.

Кто-нибудь есть какие-либо предложения?Является ли регулярное выражение правильным путем?

--- EDIT ---

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

--- EDIT 2 --- Используя пример, заданный fardjad everythingработает для приведенных данных выборки, сильное было ...

(.(?=[A-Z][a-z]))

Теперь, когда я тестирую с большим количеством данных, я вижу появление проблемы, некоторые строки начинаются с цифр, поэтому он видит их как серийные номера,Вы можете увидеть пример этого в http://regexr.com? 2vfi5

Существует только около 10 известных чисел, которые он использует в начале строк, таких как 240 В, 120 В и т. д.

Есть ли способ исключить это?

Ответы [ 2 ]

2 голосов
/ 13 декабря 2011

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

(.(?=[A-Z][a-z]))

см. это демо.

1 голос
/ 13 декабря 2011

Вы можете найти это

(?<=\p{Ll})(?=\p{Lu})

и заменить на разрыв строки. Регулярное выражение соответствует пустому пространству между строчной буквой \p{Ll} и заглавной буквой \p{Lu}.

Предполагается, что вы используете движок регулярных выражений с поддержкой Unicode (например, .NET, PCRE, Perl). Если нет, вы также можете сойти с

(?<=[a-z])(?=[A-Z])

но это, конечно, только обнаруживает изменения в словах ASCII в нижнем / верхнем регистре.

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