Regex для сопоставления с файлом, разграниченным по трубе - PullRequest
3 голосов
/ 01 ноября 2011

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

Вот что я пытаюсь использовать:

Pattern dataPattern = Pattern.compile("(.+)\\|^");

Вот пример строки данных:

GJ 3486|||121.10766667|-83.23302778|295.84892861999998|-24.832649669999999||-0.48399999999999999||.371|2MASS J08042586-8313589|8.9700000000000006|8.3539999999999992|8.1110000000000007||2MASS||

Так как я только хотел посмотреть, соответствует ли линия образцу, я думал, что тот, который я придумал, будет искать «бла-бла-бла |». Видимо, нет ... кто-нибудь может мне помочь?

Jason

Ответы [ 5 ]

7 голосов
/ 01 ноября 2011
^(.*?\|)*$

Попробуйте вместо этого.

"
^        # Assert position at the beginning of the string
(        # Match the regular expression below and capture its match into backreference number 1
   .        # Match any single character that is not a line break character
      *?       # Between zero and unlimited times, as few times as possible, expanding as needed (lazy)
   \\|       # Match the character “|” literally
)*       # Between zero and unlimited times, as many times as possible, giving back as needed (greedy)
\$        # Assert position at the end of the string (or before the line break at the end of the string, if any)
"

Некоторые проблемы с вашим регулярным выражением:

  • Во-первых, он не повторяется, вы должны повторить шаблон, так как у вас много столбцов,
  • Вы сопоставляете что-то, а затем совпадаете с началом строки.Невозможно, это никогда не совпадет.
  • Вы всегда хотите, чтобы символ совпадал, но вы сказали, что могут быть пустые столбцы.Вместо этого используйте * квантификатор.
1 голос
/ 01 ноября 2011

Ваше регулярное выражение неверно, оно должно быть:

Pattern dataPattern = Pattern.compile("(.+)\\|$");
0 голосов
/ 01 ноября 2011

Похоже, вы используете ^ в конце строки, но вы должны использовать $ вместо.

"(.+)\\|$"

0 голосов
/ 01 ноября 2011
Pattern dataPattern = Pattern.compile("^([^\\|]*\\|)+$");

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

Pattern dataPattern = Pattern.compile("^.*\\|$");
0 голосов
/ 01 ноября 2011

Как насчет этого?

str.length() > 1 && str.charAt(str.length()-1) == '|'

Вероятно, намного быстрее.

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