2016-06-17 5 views
0

Я работаю над программой цензуры, чтобы соответствовать коллекции цензурированных слов или выражений. Я хочу также найти слова, в которых каждая буква в этом слове разделяется пробелом. например, если я хочу найти something, он должен соответствовать s o m eth i n g.Регулярное выражение для поиска слов, разделенных пробелами

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

Что я могу сделать, чтобы преодолеть это?

+1

* но в некоторых ситуациях это сочетает в себе два отдельных слова, которые так цензурируются, поэтому они ошибочно совпадают. * Я не думаю, что это возможно в общем случае. –

+3

Просто добавьте '\ s *' между буквами в 'something'. –

ответ

1

^s\s?o\s?m\s?e\s?t\s?h\s?i\s?n\s?g\s?$

Вопрос знак означает, что символ может быть присутствует, но регулярное выражение по-прежнему будет соответствовать, если она отсутствует.

EDIT: заменить знаки вопроса на * -stars, чтобы можно было сопоставить несколько мест. Благодаря комментарию Wiktor.

+0

Это отлично работает. Я принял этот ответ, поскольку это был первый, который я видел перед Wiktor, и он демонстрирует именно то, что мне нужно, без дополнительных требований к коду. Благодаря! – driima

0

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

Я сделал пример: HTTP: // ideone.com/DdiKKJ

+0

Причина, по которой я поставил этот вопрос, заключалась в том, чтобы избежать такого результата; если слово «бас» находится в этом предложении, оно будет неправильно запускать «задницу» – driima

1

Вот мое предложение с комментарием: используйте \s* между символами запроса

.replaceAll("(?<=.)(?!$)", "\\\\s*") 

См regex demo.

Это добавит \s* к слову поиска. Весь Java demo будет выглядеть

String search = "something"; 
String rx = search.replaceAll("(?<=.)(?!$)", "\\\\s*"); 
Pattern pat = Pattern.compile(rx); 
Matcher matcher = pat.matcher("s o m eth i n g"); 
if (matcher.find()) { 
    System.out.println(matcher.group(0)); 
} 

В случае, если есть знаки препинания с пространством, используйте "\\\\W*" вместо "\\\\s*".

+0

Это работает так, как предполагалось, но я принял ответ Якуба, поскольку это был первый ответ, который я увидел, который демонстрирует именно то, что мне нужно, без добавления кода. (Я использую другие регулярные выражения, которые не нуждаются в этой функции.) – driima

+0

На самом деле мое предложение было оригинальным, размещенным как комментарий. Но, как вы пожелаете. –