регулярное выражение Java для String.contains - PullRequest
1 голос
/ 21 октября 2011

Я ищу, как создать регулярное выражение, которое на 100% эквивалентно методу «содержит» в классе String. По сути, у меня есть тысячи фраз, которые я ищу, и из того, что я понимаю, гораздо эффективнее по соображениям производительности скомпилировать регулярное выражение один раз и использовать его несколько раз, против вызова «mystring.contains (testString)» снова и снова на разных значениях "mystring", с теми же значениями testString.

Редактировать: чтобы расширить мой вопрос ... У меня будет много тысяч значений "testString", и я не хочу преобразовывать их в формат, понятный механизму регулярных выражений. Я просто хочу иметь возможность напрямую передать фразу, которую вводят пользователи, и посмотреть, найдена ли она в каком-либо значении «mystring». «testString» никогда не изменит его значения, но их будет тысячи, поэтому я думал о создании объекта matcher, его повторном использовании снова и снова и т. д. (Очевидно, мои навыки регулярного выражения не подходят для работы)

Ответы [ 2 ]

2 голосов
/ 21 октября 2011

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

 Pattern p = Pattern.compile(yourString, Pattern.LITERAL);

Но действительно ли вы действительно уверены, что сделать это и затем повторно использовать результат быстрее, чем просто String#contains?Достаточно, чтобы сложность того стоила?

1 голос
/ 21 октября 2011

Ну, вы можете использовать Pattern.quote, чтобы получить «кусок регулярного выражения» для каждой входной строки. Есть ли в ваших терминах разрывы строк? Если это так, то это может, по крайней мере, сделать жизнь немного сложнее, хотя и далеко не невозможной.

В любом случае, вы просто присоединитесь к цитируемым терминам вместе:

Pattern pattern = Pattern.compile("quoted1|quoted2|quoted3|...");

Возможно, вы захотите использовать Joiner в Guava для простого объединения строк в кавычках, хотя, очевидно, это не так сложно сделать вручную.

Однако я бы попробовал это, а затем протестировал , действительно ли это эффективнее, чем просто вызов contains. У вас уже есть тест, который показывает, что contains слишком медленно?

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