2015-02-25 2 views
0

У меня есть строка, которая имеет разделитель, такой как «|»Regex: Полное совпадение для строки, разделенной разделителем

e.g. "South NY, US | South-East NY, US| North NY, US" 

примечание: пространство вокруг трубы с обеих сторон может отображаться или не отображаться.

Я пытался использовать .Contains(), чтобы соответствовать заданной строке, но она также соответствует случай, как «Восточный Нью-Йорк, США»

я получил небольшую функцию (в Java), чтобы соответствовать строка поиска, но она неэффективна.

boolean fullmatch (String search, String text) { 
    String[] split = text.split ("\\|"); 
    for (int i = 0; i < split.length; i++) { 
     if (split[i].trim().equals (search)) { 
      return true; 
     } 
    } 
    return false; 
} 

Каким будет эквивалентное регулярное выражение для этого? Спасибо

Дополнительно: Что было бы эквивалентным регулярным выражением в SQL тоже? (Стараясь не вытащить большое количество данных для сравнения в Java)

ответ

0

Попробуйте это:

boolean fullmatch (String search, String text) { 
    return text.matches(".*(^|\\|)\\s*" + search + "\\s*(\\||$).*"); 
} 
+0

Это не будет очень эффективно, так как 'matches' будет иметь возможность перебирать весь текст, даже если он найдет правильный элемент в начале его. – Pshemo

+0

@Pshemo Я полагаю, вы имеете в виду среднюю эффективность. Точка принята. – shmosel

+0

Да, исправил мой комментарий :) – Pshemo

4

Я сомневаюсь, что ваш метод слишком неэффективно, или что вы можете сделать это гораздо более эффективным; но для чистого и простого кода (который также будет выполнять по крайней мере, несколько лучше), вы можете написать:

boolean fullmatch (String search, String text) { 
    return Pattern.compile(
     "(?:^|\\|)\\s*" + Pattern.quote(search) + "\\s*(?:\\||$)") 
     .matcher(text).find(); 
} 

Например, если ваш search является "South-East NY, US", то выше возвращает истину, если text содержит подстроку, соответствующую (?:^|\|)\s*South-East NY, US\s*(?:\||$) (start-of-string-or-pipe, плюс необязательные пробелы, плюс строка поиска, а также необязательные пробелы, плюс строка-строка-конец строки).