2014-08-27 3 views
0

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

Pattern.compile("((?:[A-Z](?:\\.|(?:(?:\\w|-)[A-Z]))+)\\s*){2,}"); 

Проблема заключается в том, что иногда, самое последнее письмо потеряется. Случаи:

"By VERA RAMIREZ, MOLLIE RILER and GEORGE SHAW BROWN" 
"By LORA D. WOODARD<br/><a href="http://www.test.com/ " target="external">test</a> CEO and President" 
"By ANN-ROSE ABRAHAM, Credit.com" 

Каждый имеет представление о том, как это исправить?

+2

Что такое предполагаемое использование вашего шаблона? Просто эти случаи, или вы можете дать более общее описание? – hexafraction

+0

Охарактеризуйте «иногда». –

+0

Я исправил этот первый вопрос, добавив '+' к последнему [A-Z]. – user2917629

ответ

0

Эти два предмета заставляют двигатель останавливаться на равномерной символьной границе.

(?: \w | -) 
[A-Z] 

В сущности, вы должны изменить его на

(?: \w | -)? 
[A-Z] 

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

Я бы принять удар в темноте и сказать, что имел в виду что-то вроде этого -
Добавлен список исключений

# By KESHA SWEET AP Host Writer 
# "By VERA RAMIREZ, MOLLIE RILER and GEORGE SHAW BROWN" 
# "By LORA D. WOODARD<br/><a href="http://www.test.com/ " target="external">test</a> CEO and President" 
# "By ANN-ROSE ABRAHAM, Credit.com" 


# "((?:(?!\\b(?:AP|USA|UPS|USPS)\\b)[A-Z](?:\\.|(?:[\\w-]*[A-Z])+))\\s*){2,}(?<!\\s)" 

(         # (1 start) 
     (?: 
      (?!      # Exclude stuff here 
       \b 
       (?: AP | USA | UPS | USPS) 
       \b 
      ) 
      [A-Z] 
      (?: 
       \. 
      | 
       (?: 
        [\w-]* 
        [A-Z] 
       )+ 
      ) 
    ) 
     \s* 
){2,}        # (1 end) 
(?<! \s) 
+0

Я должен иметь w | - без *, потому что что-то вроде «By KESHA SWEET AP Host Writer» вернет «KESHA SWEET AP». Но мне нужно «KESHA SWEET». – user2917629

+0

Теперь у меня есть "((?: [AZ] (?: \\ w \\. | \\. | (?: (?: \\ w | -) [AZ] +)) +) \\ s *) {2,} ", но теперь проблема« тест ARINE DE VOGUE »дает мне только« ARINE »вместо« ARINE DE VOGUE ». – user2917629

+0

Я бы сказал, что на естественном языке вы не можете писать регулярное выражение, чтобы различать «AP» от информационного агентства или первого/среднего/фамилия. Как вы думаете? – sln

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