2014-01-29 3 views
0

У меня есть проблема, чтобы написать регулярное выражение Java, здесь требования соответствующих строк:Написать регулярное выражение Java

  • ' or abc: матч
  • X' or abc: матч
  • Good X' or abc: матч
  • Good 'X' or abc: не соответствует

Я использую java.util.regex.Patte rn и java.util.regex.Matcher. match означает java.util.regex.Matcher.matches() возвращает true.

Вот регулярное выражение, которое я написал: ".*((((?<!\\')[^\\s\\']+))[\\'\\s]+(or|and)).*". Но это не сработает.

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

Я новичок в регулярном выражении, может ли кто-нибудь мне помочь?

Спасибо.

+2

Не могли бы вы объяснить правило для соответствия/не совпадать с регулярными словами? – Xabster

+0

Вы пробовали '^ [^ '] *' [^ '] * $'? Если вы используете метод 'String # matches', вы можете удалить'^'и' $ 'в начале и конце регулярного выражения – BackSlash

+1

https://www.debuggex.com/, что удобно, если вам нужно отлаживать регулярные выражения – BetaRide

ответ

1

Если вы должны использовать * в начале выражения, то это работает:.

".*(?=(?<!Good 'X)' or abc$).*" 

Хитрость заключается в том, что он смотрит вперед, используя «(=?» Выражения, которые заканчиваются «» или abc ", но без" Хорошего "X" перед ним - с помощью отрицательного lookbehind "(? <!".

+0

Привет, спасибо за ответ. Это хорошее решение. Но я предпочитаю более общее решение, например, не используя «Good» X в регулярном выражении. – qiuzmjq

+0

Какие части строк значительны? Если вам требуется обобщенное выражение, вам нужно описать шаблоны, которые должны (не) совпадать, а не только 4 статические строки. –

+0

Привет, Спасибо за советы. Оно работает. – qiuzmjq

2

Из ваших примеров, я думаю, вы пытаетесь проверить, есть ли только один ' в строке.

Регулярное выражение может быть ^[^']*'[^']*$, что с помощью способа matches может быть уменьшена до [^']*'[^']*:

  • [^']*: Все, что не '
  • ': а '
  • [^']*: Все, что не '

String[] a = { 
    "' or abc", 
    "X' or abc", 
    "Good X' or abc", 
    "Good 'X' or abc" 
}; 

for (int i = 0; i < a.length; i++) { 
    Pattern p = Pattern.compile("[^']*'[^']*"); 
    Matcher m = p.matcher(a[i]); 
    System.out.println(m.matches()); 
} 

Выход:

true 
true 
true 
false 

Однако, вам не нужно Pattern и Matcher для этой цели, просто использовать

yourString.matches("[^']*'[^']*"); 
+0

Привет, спасибо за ответ. Как я упоминал в описании, я должен поставить «. *» Как в начале, так и в конце регулярного выражения. Если я сделаю это для вашего регулярного выражения, регулярное выражение будет «. * ([^ '] *' [^ '] *). *", А четвертое возвращает true. – qiuzmjq

+0

@qiuzmjq Могу ли я спросить вас, почему вам нужно поставить '. *' В начале и в конце регулярного выражения? Если вы хотите объяснить, возможно, мы сможем найти лучшее решение :) – BackSlash

1

Это регулярное выражение, который использует негативный взгляд вперед , проходит ваши испытания:

if (str.matches("^(?!(.*?'){2}).*")) 

См. live demo.

Смежные вопросы