Разделение регулярных выражений Java

У меня есть некоторые данные, отформатированные следующим образом

2009.07.02 02:20:14  40.3727   28.2330        6.4      2.6  -.-  -.-   BANDIRMA-BALIKESIR
2009.07.02 01:38:34  38.3353   38.8157        3.5      2.7  -.-  -.-   KALE (MALATYA)
2009.07.02 00:10:28  38.8838   26.9328        3.0      3.0  -.-  -.-   CANDARLI KÖRFEZI (EGE DENIZI)
2009.07.01 23:33:31  36.8027   34.0975        8.2      2.9  -.-  -.-   GÜZELOLUK-ERDEMLI (MERSIN)
2009.07.01 22:32:44  38.9260   27.0338        5.0      3.4  -.-  -.-   CANDARLI KÖRFEZI (EGE DENIZI)
2009.07.01 22:12:37  40.2120   41.0378        3.7      2.9  -.-  -.-   OVACIK-ILICA (ERZURUM)
2009.07.01 22:10:53  38.9208   26.9502        5.0      3.5  -.-  -.-   ÇANDARLI-DIKILI (IZMIR)
2009.07.01 21:44:29  38.8695   27.1268        6.9      2.9  -.-  -.-   YUNTDAG-BERGAMA (IZMIR)
2009.07.01 21:27:53  38.9073   26.9895        5.0      3.0  -.-  -.-   CANDARLI KÖRFEZI (EGE DENIZI)
2009.07.01 21:18:19  38.9212   26.9060        5.0      3.4  -.-  -.-   CANDARLI KÖRFEZI (EGE DENIZI)
2009.07.01 21:12:15  38.8657   26.9447       13.7      3.8  -.-  -.-   CANDARLI KÖRFEZI (EGE DENIZI)
2009.07.01 21:09:43  38.9260   27.0853        5.0      3.1  -.-  -.-   ZEYTINDAG-BERGAMA (IZMIR)
2009.07.01 21:05:40  38.9153   26.9710        5.0      3.4  -.-  -.-   ÇANDARLI-DIKILI (IZMIR)
2009.07.01 20:29:02  37.6888   38.7212        5.0      3.3  -.-  -.-   AKINCILAR-KAHTA (ADIYAMAN)
2009.07.01 18:17:12  41.2700   36.0502        2.7      2.7  -.-  -.-   TAFLAN- (SAMSUN)
2009.07.01 17:50:03  38.6312   35.7962        5.0      2.8  -.-  -.-   ELBASI-BÜNYAN (KAYSERI)

Я хотел бы разбить это на белые линии, но я бы хотел, чтобы последний столбец не разбивался, когда есть круглые скобки? Я хотел бы, чтобы каждая строка разбивалась на 8 частей. Это возможно?


person Hamza Yerlikaya    schedule 02.07.2009    source источник


Ответы (4)


Поместите это в инструмент регулярного выражения, например RegexBuddy.

Но для ваших целей будет легко разбить на \s+ или \s\s+ и установить лимит. Это зависит от того, какие части текста вам нужны, поэтому вы используете этот инструмент, чтобы помочь вам написать регулярное выражение.

Если вы специально хотите избежать совпадения пробелов, которым предшествует "(", что на самом деле не решает вашу проблему из-за возможных строк, таких как "Words (word word)", вы можете использовать группа отрицательного просмотра с нулевой шириной. Что-то вроде \s+(?!\().

person dlamblin    schedule 02.07.2009
comment
Это не работает. Разделение с помощью \s+ и пределом 8 приводит к тому, что последнее -.- и поле имени объединяются, и это предполагает, что вы выполняете разделение в каждой строке. Разделение с ограничением в 9 будет работать, если вы не возражаете против того, чтобы метка времени была разделена на две части. - person Trampas Kirk; 02.07.2009
comment
Он специально сказал: я хотел бы, чтобы каждая строка четко разделялась на 8 частей, я не заметил единственного пробела между временной меткой. Вы можете взять каждую строку и .split(@\s\s+,8) - person dlamblin; 02.07.2009

Почему вы используете регулярное выражение здесь?

Файл данных идеально выровнен, вы можете извлечь данные с помощью

line.substring(0,12)
line.substring(13,20)
..
..

Так намного быстрее.

person J-16 SDiZ    schedule 02.07.2009

Думаю, вам нужно 9 штук, а не 8. Так что попробуй, line.split("\\s+", 9);.

person Community    schedule 02.07.2009

Это похоже на форматированный текст. Первым предположением было бы разбить символы табуляции.

String[] parts = line.split('\t');

Если это не сработает, я бы разбил пробелы, за которыми не следуют скобки. Посмотрите в javadoc в разделе «Шаблон» синтаксис шаблона просмотра вперед: например. если ты разделишься

"ABC DEF (GHI)" 

в регулярном выражении:

String regex="\\ (?!\\()";

(прочитайте это как «пробел (?! X)», где «(?! X) означает «отрицательное упреждающее соответствие« X », а экранированный openparen «\ (» заменяется).

вы получаете "ABC, DEF (GHI)"

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

person Steve B.    schedule 02.07.2009
comment
если он разделен табуляцией, просто используйте string.split(\t) - person J-16 SDiZ; 02.07.2009