Регекс соответствия для абзацев - PullRequest
0 голосов
/ 03 мая 2018

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

Что у меня сейчас есть:

[\n\n]+  

Образец текста:

Das Pensionat Klinger war bereits etwas zusammengeschmolzen, als das Junge Ehepaar Daselbst Eintrat. Es war ein unreundlicher, regnerischer Зоммер gewesen. Klagen überall ... aus der Schweiz - vom Salzkammergut her, wo der berüchtigte »Schnürlregen« tagaus tagein herabgoß - Klagen vom Ostseestrande und aus dem Энгадин ... Клаген lieblichen Gebirgsnest в Зюд-Баварии, в лучшем мужчине Wetter sonst arg verwöhnt war.

Ein so reizendes Stück Erde! Тиф гелеген - хох гелеген, ви муж Эбен Нехмен Вольте, Денн Ди Зирличен, Ви Аус дер Шпильцойгшахтель genommenen Häuschen kletterten hier waghalsig die Berge empor, versteckten sich dort eigenwillig unter breitästigen Obstbäumen tief пьяный им тал. Aber die Sonne и все вместе Брайтен Страленфлютен Хеллен Голдес и Бергвинд, Фриш Фриш und kühl vom Gebirge herunterfuhr, strich darüber hin - und ringumher Griffen Die Berge Wie Die Glieder Эйнер Гевальтиген Кетте Инейнандер ... einige grün, dicht bewaldet, die anderen kahl und schroff, hoch oben nur mit kümmerlichem Fichtenwuchs bestanden, und etwelche unter Ихен Штольц Зу Ден Волькен Ауфранд, Эвиген Шнее ауф дем Хаупт В логове Фальтен де Обергевандес блаушиммерндес Глетсхереис!

Я продолжаю получать отзывы о том, что в конце строки я получаю токен с TokenParagraph.

Например:

.... и есть [это где он пропускает шаги]

Редактировать:

при попытке (\n|^).*?(?=\n|$)

Я получаю,

Предварительная обработка исполняемого файла 'Main' для lexing-0.1.0.0 .. Tokens.x: 22: 8: ошибка синтаксического анализа

%wrapper "basic"

$whiteSpace     = [\ \t \f \v \r]
$digit          = 0-9                                                                                     
$alpha          = [a-zA-Z]                          


tokens :-

  $whiteSpace+        ;
  $digit+             ;                              
  (\n|^).*\?(\?=\n|$)   { \s -> TokenParagraph  }  

1 Ответ

0 голосов
/ 03 мая 2018

Что у меня сейчас есть:

[\n\n]+

На предположение: вы ожидаете, что это совпадет с произвольным количеством копий двух строк подряд. Но на самом деле [] создает регулярное выражение класса символов, которое соответствует только одному символу (любому из символов, заключенных в квадратные скобки). Так что это соответствует любому положительному числу новых строк, включая только один.

Это легко исправить, хотя правильное исправление зависит именно от того, что вы хотите. Если вы хотите, чтобы в качестве разделителя абзацев использовалось любое количество новых строк, больше двух, попробуйте

\n\n+

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

(\n\n)+

это то, что вы хотели. (Не будучи экспертом по alex, я не могу вспомнить, нужно ли избегать скобок; извините за это.)

...