2013-05-13 3 views
0

У меня есть цель струнное что-то вроде этого PT_content: data1 И PT_content2: data2 ИЛИ PT_content3: Data3Regex, чтобы проверить, когда слово шаблон отсутствует в строке

Теперь мне нужно проверить, нет ли там недействителен классификатор в строке, Например

PT_content:. data1 И PR_content2: data2 ИЛИ PT_content3: данные3 (это является недопустимым, как только PT_xxxxxx:. данные допускается)

Я попробовал некоторый узор с отрицательной упреждающей выборкой, но это не так EEM s работать

Pattern.compile("(?!.*PT_[a-zA-Z]*:)") 

Благодарности

ответ

0

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

+0

Я не знаю много об этом. –

+0

Не получится. Если вы соответствуете определенному шаблону и как часть шаблона слово должно отсутствовать, то включение слова как присутствующего, а затем выполнение противоположного этого шаблона действительно будет соответствовать отсутствующему слову, но также не будет соответствовать остальным шаблон. – OCDev

1
^(PT_[a-z]*:data($| AND | OR))+$ 

Данный шаблон соответствует несколькими PT_xxxxxx: данные с последующим AND, OR или конца строки. В этом шаблоне может быть xxxxxx быть любым от '' до неограниченного количества символов, если он состоит только из альфа.

Это то, что вы ищете, я чего-то не хватает?

EDIT

только Альфы допускается в качестве разделителей. Это покрывает AND и OR тоже, так как позволяет столицам.

^(PT_[a-z]*:data($| [a-zA-Z]*))+$ 
+0

Это может быть И ИЛИ или какая-либо другая вещь xxxxx - это [a-z] * на самом деле. –

+0

Вы имеете в виду, что эти значения могут быть разделены больше, чем просто 'AND' или 'OR'? Вы должны указать, по каким требованиям будут соответствовать эти разделители. – Aquillo

+0

Поскольку вы не можете просто заменить разделенные символы, так как это обойдет ваши негативы (например, «PR_abc: data»). – Aquillo

2

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

^(?:PT_[a-zA-Z]*:[^ ]+ (?:AND|OR|$))+$ 
+0

вы должны добавить якоря^$, чтобы убедиться, что это работает. –

+0

Я обновил свой ответ. – Stephan

0

Не уверен, действительно ли вам нужно предпросмотр или здесь 'назад.

Если ваша проблема с "PR_" вместо "PT_", попробуйте следующее:

String content = "PT_content:data1 AND PR_content2:data2 OR PT_content3:data3"; 
Pattern badSyntax = Pattern.compile("P[^T]_.*?:.*?\\s"); 
Matcher matcher = badSyntax.matcher(content); 
while (matcher.find()) System.out.println(matcher.group()); 

Выход:

PR_content2:data2 
+0

Привет, Мена. К сожалению, это может быть что угодно, а не только ** PT ** –