2013-09-12 5 views
0

Я ищу шаблон регулярного выражения, а не код Java, чтобы соответствовать последнему слову в предложении на английском (или европейском языке). Если последнее слово, в данном случае, «привет», то я хочу соответствовать «привет», а не «привет».regex последнее слово в предложении, заканчивающемся пунктуацией (период)

Регулярное выражение (\w+)\.$ будет соответствовать «привет», тогда как выход должен быть просто «привет». Какое правильное регулярное выражение?

[email protected]:~/NetBeansProjects/regex$ 
[email protected]:~/NetBeansProjects/regex$ java -jar dist/regex.jar 


trying 
a b cd efg hi 
matches: 
hi 


trying 
a b cd efg hi. 
matches: 
[email protected]:~/NetBeansProjects/regex$ 

код:

package regex; 

import java.util.regex.Matcher; 
import java.util.regex.Pattern; 

public class Main { 

    public static void main(String[] args) { 
     String matchesLastWordFine = "a b cd efg hi"; 
     lastWord(matchesLastWordFine); 
     String noMatchFound = matchesLastWordFine + "."; 
     lastWord(noMatchFound); 
    } 

    private static void lastWord(String sentence) { 
     System.out.println("\n\ntrying\n" + sentence + "\nmatches:"); 
     Pattern pattern = Pattern.compile("(\\w+)$"); 
     Matcher matcher = pattern.matcher(sentence); 
     String match = null; 
     while (matcher.find()) { 
      match = matcher.group(); 
      System.out.println(match); 
     } 
    } 
} 

Мой код в Java, но это не является ни здесь, ни там. Я строго ищу регулярное выражение, а не код Java. (Да, я знаю, что можно удалить последний символ с помощью Java.)

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

+1

регулярного выражения вы используете в вашем код делает не имеет '\ .' в нем. Ваше регулярное выражение выглядит правильно для меня, группа захвата будет содержать слово без периода. – cyon

+0

Подождите, так что вы хотите совместить последнее слово в строке. И если линия заканчивается периодом, то вы не хотите иметь период? – Taemyr

+0

@Taemyr точно. если есть период, то только последнее слово. – Thufir

ответ

3

Вы можете использовать lookahead asserion. Например, чтобы соответствовать предложению без периода:

[\w\s]+(?=\.) 

и

[\w]+(?=\.) 

Для только последнего слова («» слова перед)

+0

'[\ w] + (? = \.)' Был конкретным битом, который я искал. Я посмотрю, что означает это утверждение. – Thufir

0

Используя оператор $, вы получите только совпадение в конце строки. Поэтому, если у вас несколько предложений на одной строке, вы не получите совпадения в середине.

Таким образом, вы должны просто использовать:

(\w+)\. 

группа захвата даст правильный матч.

Вы можете увидеть пример here

+0

@jboi Отредактируйте [http://regex101.com/r/lN6hF3](http://regex101.com/r/lN6hF3) – smerlung

+0

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

1

Вы можете использовать matcher.group(1), чтобы получить содержание первой группы захвата ((\w+) в вашем случае). Чтобы сказать немного больше, matcher.group(0) вернет вам полный матч. Поэтому ваше регулярное выражение почти правильно. Улучшение связано с вашим использованием $, которое поймает конец линии. Используйте это только в том случае, если ваше предложение заполняет именно строку!

2

Если вам нужно иметь весь матч быть последним словом вы можете использовать lookahead.

\w+(?=(\.)) 

Это соответствует набору словесных символов, за которыми следует период, без соответствия периоду.

Если вы хотите, чтобы последнее слово в строке, независимо от погодных линия заканчивается на конце предложения или вы не можете использовать:

\w+(?=(\.?$)) 

Или, если вы хотите, чтобы также включать!;: И т.д., то

\w+(?=(\p{Punct}?$)) 
0

Я не понимаю, почему действительно, но это работает:

package regex; 

import java.util.regex.Matcher; 
import java.util.regex.Pattern; 

public class Main { 

    public static void main(String[] args) { 
     String matchesLastWordFine = "a b cd efg hi"; 
     lastWord(matchesLastWordFine); 
     String noMatchFound = matchesLastWordFine + "."; 
     lastWord(noMatchFound); 
    } 

    private static void lastWord(String sentence) { 
     System.out.println("\n\ntrying\n" + sentence + "\nmatches:"); 
     Pattern pattern = Pattern.compile("(\\w+)"); //(\w+)\. 
     Matcher matcher = pattern.matcher(sentence); 
     String match = null; 
     while (matcher.find()) { 
      match = matcher.group(); 
     } 
     System.out.println(match); 
    } 
} 

Я думаю, регулярное выражение \w+ будет соответствовать все слова (DOH). Тогда последнее слово - то, чем я был. Слишком просто, действительно, я пытался исключить пунктуацию, но я думаю, регулярное выражение делает это автоматически для вас ..?

+1

Это работает, потому что совпадёт все совпадения. И ваш цикл while повторяет все это. Итак, как только этот цикл завершен, он указывает на последнее слово. См. Ответы ниже, чтобы использовать lookahead для соответствия условиям, которые должны соответствовать соответствию. Или использовать группы для сохранения только частей матча. – Taemyr

0

С помощью этого регулярного выражения (\w+)\p{Punct} вы получаете групповое число в 1, означает, что вы получаете одну группу с punctionation на matcher.group(0) и одну без знаков препинания на matcher.group(1).

Чтобы написать регулярное выражение в Java, используйте: "(\\w+)\\p{Punct}"

Чтобы проверить регулярные выражения в Интернете с Java (и на самом деле много других языков) см RegexPlanet

+0

Правильно ли это относится к «test1, test2 test3» – Taemyr

+0

Я думаю, что это, скорее всего, лучший путь к решению, но нет, простить, а не то, что я искал. Это возвращает «привет». тогда как я хочу просто «привет» ** без ** точки. Простите, если это неясно. Однако этот синтаксис '\ p' очень интересен :) – Thufir

+1

Для« test1, test2 test3 »он возвращает« test1 ». Я ожидаю, вот что было задано. Чтобы прояснить это: 'matcher.group (1)' содержит слово WITHOUT пунктуации («привет», а не «привет»). Тем не менее «привет». можно найти в 'matcher.group (0)'. – jboi

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