2016-01-31 4 views
1

При фильтрации из списка строк я хочу совместить последовательные одиночные символы как целое словоСопоставьте последовательные одиночные символы как целое слово

например. ниже строки

'm g road' 
'some a b c d limited' 

в первом случае должны совпадать, если пользователь

"mg" or "m g" or "m g road" or "mg road" 

во втором случае должны совпадать, если пользователь

"some abcd" or "some a b c d" or "abcd" or "a b c d" 

Как я могу это сделать, может Я достигаю этого с помощью регулярного выражения?

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

например «мг дорога» или «дорога мг» я могу обрабатывать путем поиска «мг» и «дороги» один на один

EDIT

Для изготовления требования более ясным, ниже мой тестовый случай

@Test 
public void testRemoveSpaceFromConsecutiveSingleCharacters() throws Exception { 
    Assert.assertTrue(Main.removeSpaceFromConsecutiveSingleCharacters("some a b c d limited").equals("some abcd limited")); 
    Assert.assertTrue(Main.removeSpaceFromConsecutiveSingleCharacters("m g road").equals("mg road")); 
    Assert.assertTrue(Main.removeSpaceFromConsecutiveSingleCharacters("bank a b c").equals("bank abc")); 
    Assert.assertTrue(Main.removeSpaceFromConsecutiveSingleCharacters("bank a b c limited n a").equals("bank abc limited na")); 
    Assert.assertTrue(Main.removeSpaceFromConsecutiveSingleCharacters("c road").equals("c road")); 
} 
+0

Вы можете вырезать пробелы внутри пространственно окруженных одиночных букв '.replaceAll (" (? <= \\ b \\ w) + (? = \\ w \\ b) "," ")' [like в этой демонстрации] (http://fiddle.re/9kkdz6) (щелкните Java). Сделайте это для обоих: stringtocheck и userinput. Убедитесь, что [stringtocheck .contains userinput] (http://stackoverflow.com/a/2275035/5527985). –

+1

@bobblebubble да, это сработало .. Спасибо, вы можете добавить его как ответ – Akhil

ответ

1

1.) раздеть пространства в пространстве окруженных одной буквы из stringtocheck и UserInput.

.replaceAll("(?<=\\b\\w) +(?=\\w\\b)","") 
  • (?<=\b\w)look позади, чтобы проверить, если предшествует \bword boundary, \wword character
  • (?=\\w\\b) смотреть вперед, чтобы проверить, а затем \w слово символов, \b слово граничного

See demo at regexplanet (click Java)

2.) Проверьте, нет ли stringtocheck.containsuserinput.

1

Похоже, вы просто хотите игнорировать пробелы. Вы можете легко сделать это, удалив пустое пространство как с целевой строки, так и с пользовательского ввода, прежде чем искать совпадение.

+0

да, что может работать .. но я хочу совместить «дорожный мг» и «дорожный мг» также в первом случае .. означает, что я хочу обрабатывать последовательные одиночные символы как одно слово – Akhil

+0

@Akhil - Ах. Вы не повышали возможность появления слов не в своем начальном посте. Поэтому пользовательский ввод «дорожный мг» должен соответствовать, но как насчет «дороги g m»? Или даже «дорога gm»? –

+0

Извините за непонятные требования, я добавил свой тестовый пример сейчас под вопросом – Akhil

-1
str = str.replaceAll("\\s",""); 
+0

У меня есть другие требования, чтобы упорядочить слова в поисковом запросе, пожалуйста, проверьте последнюю часть вопроса – Akhil

0

следующее регулярное выражение (в многострочном режиме) может помочь вам:

^(?<first>\w+)(?<chars>(?:.(?!(?:\b\w{2,}\b)))*) 
# assure that it is the beginning of the line 
# capture as many word characters as possible in the first group "first" 
# the construction afterwards consumes everything up to (not including) 
# a word which has at least two characters... 
# ... and saves it to the group called "chars" 

Вам нужно будет только заменить пробельные во второй группе (так называемый «символов»).
Посмотреть демо on regex101.com

+0

спасибо, но это не сработало, как ожидалось – Akhil

+0

@Akhil: И * почему * нет? – Jan

+0

«m g road» дает первые [0-1] 'm'chars \t [1-3] \t' g' – Akhil

1

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

"abcd" becomes regex "\ba ?b ?c ?d\b" 

Для достижения этой цели, это сделать каждое слово перед сопоставлением:

word = "\\b" + word.replaceAll("(?<=.)(?=.)", " ?") + "\\b"; 

Разбиение слов \b необходимо для прекращения совпадения "comma bcd" или "abc duck".

1

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

(^(\w\s+)+)|(\s+\w)+$|((\s+\w)+\s+) 
Смежные вопросы