2016-04-14 3 views
1

В настоящее время я пытаюсь создать регулярное выражение, которое будет соответствовать каждый раз, когда есть квалифицированное переменное использование
Для примера:
Regex найти квалифицированную Используй переменную

int foo = foofoo.bar; 

возвращения foofoo.bar

foo.method(foobar.bar); 

вернет foobar.bar

Мой текущий подход заключается в использовании это регулярное выражение

[\w]*[.][\w]*<(?!\() 

Где она соответствует имя класса, период, общественность переменная, наконец, указывает, что не следует кронштейном (чтобы отличать его от вызовов метода) с

В настоящий момент часть проверки конечного кронштейна, похоже, не работает, и будет признательна за любую помощь!

+0

не уверен относительно аромата java regex, но <перед тем, как взгляд выглядит странным. Кроме того, вы можете просто отрицать класс символов для скобок, '\ w + \. \ w + [^ (]' будет моим подходом – DesertEagle

+0

Вы уверены, что это хороший подход. Что делать, если вы вынуждены использовать полностью квалифицированные имена ? .. – TheLostMind

+0

@DesertEagle кажется на ходу. Но я бы также принял во внимание возможность добавления белого пространства в разные моменты - '\ w + \ s * \. \ S * \ w + \ s * [^ (]'. В противном случае 'foo.method (foobar.bar);' возвратит оба 'foo.method' ** и **' foobar.bar'. – ClasG

ответ

0

Быстрое решение:

\b[^\W\d]\w*(?:\s*\.\s*[^\W\d]\w*\b)+(?!\s*\() 

regex101 (пример PCRE, но здесь применимо, поскольку функции, которые я использовал имеющиеся в Java, а).

Используйте границы слов (\b), чтобы обеспечить соответствие целых слов, а также убедитесь, что вы можете обрабатывать пробелы (\s*).

[^\W\d]\w* походит на \w+, за исключением того, что он не содержит цифру в качестве первого символа.

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

+0

Для моего варианта использования мне также нужно найти его в комментариях и строках, так что он отлично работает! Спасибо :) – eliza

+0

Я забыл упомянуть: вы В начале нужно добавить что-то вроде '(?! \ d)', чтобы избежать сопоставления значений с плавающей запятой, например, «42.00». Или замените * each * '\ w +' на '[^ \ W \ d] \ w *' - это будет более корректно. –