предложение требуется для Regexp Lookaround в Java - PullRequest
1 голос
/ 17 сентября 2011

Я часто использую регулярные выражения в своем проекте. Мне нужны некоторые предложения для тестовых строк:

1     string           3.33
      string
      1
      string          -3.33

Мне нужно сопоставить 2-ю и 3-ю строки (значит, мне не нужна строка с 3,33 (валюта) в конце строки) Я перепробовал так много вариантов. Лучшее, что я получил, это:

^[\s]+.+[^(?!(\d+\.\d+))]$

Строка 2 соответствует этому регулярному выражению, но строка 3 не соответствует.

Примечание: меня волнует начало или конец строки. Таким образом, отмеченные выше тестовые строки имеют идеальные пробелы.

Я использую Java в качестве языка программирования.

Ответы [ 2 ]

1 голос
/ 17 сентября 2011
[^(?!(\d+\.\d+))]

- это класс символов . Класс символов соответствует ровно одному символу из набора символов, который вы описываете в квадратных скобках. Ваш эквивалент этому:

[^!()+.\d]

^ в начале инвертирует набор, а \d соответствует цифре так же, как и вне класса символов, но остальные символы буквально совпадают. Другими словами, вы указываете, что он соответствует любому одному символу, который не !, (, ), +, . или цифре.

Похоже, вы пытались использовать негативную перспективу, которая является правильным подходом. Если вам важна только сумма в долларах в конце строки, вы можете сделать это:

^(?!.*\d+\.\d+$).*$

Lookahead пытается соответствовать \d+\.\d+ в конце строки. Если это удастся, общее совпадение не удастся. В противном случае .*$ занимает всю строку, поэтому вы можете получить ее с помощью метода group() Matcher.

Предполагается, что вы применяете регулярное выражение к одной строке за раз. Если вы пытаетесь найти совпадающие строки в большем тексте, вы должны указать режим MULTILINE, который вы можете сделать так:

(?m)^(?!.*\d+\.\d+$).*$
0 голосов
/ 17 сентября 2011

вы тестировали текст построчно?

, тогда вы можете использовать re: \d+\.\d+$ для соответствия тексту, который вам нужен НЕ .Если match () возвращает false, вы берете строку.

ну, это похоже на grep -v.

, если проверить это с помощью grep:

kent$  cat a
1     string           3.33
      string
      1
      string          -3.33

kent$  grep -Pv '\d+\.\d+$' a
      string
      1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...