2016-04-21 2 views
1

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

"trying to find the first word".matches(".*[^a-z]find[^a-z].*") //returns true 
"trying to find the first word".matches(".*[^a-z]trying[^a-z].*") //returns false 
"trying to find the first word".matches(".*[^a-z]word[^a-z].*") //returns false 

Любая идея, как сделать это соответствие любому слову в строке?

Спасибо заранее,

Craig

+1

'\ bWORD \ b' как' \ b' является якорем «границы слова». Соответствующее чтение: http://www.regular-expressions.info/wordboundaries.html – CollinD

+0

любая причина, по которой вы не просто используете 'String.contains (String)'? – showp1984

+0

им не используется, потому что я не хочу находить слова внутри других (т. Е. Если im ищет ожог, сожженный будет правдой) Я попытался положить \ b, но он, похоже, не работает. – craigtb

ответ

0

Проблема заключается в вашем классе символов до и после слов [^a-z] - Я думаю, что вы на самом деле хотите это слово границы характер \b (согласно комментариям ColinD), сколько напротив, не является символом в диапазоне az. Как указано в комментариях (спасибо), вам также потребуется обработать начало и конец строк.

Так что попробуйте, например:

"(?:^|.*\b)trying(?:\b.*|$)" 
+1

Не будет '\ W' не соответствовать'^'и' $ '? Или я ошибаюсь? – CollinD

+1

Комментарий @CollinD к вопросу правильный. Этот ответ не будет работать, потому что класс символов «[]» соответствует ровно одному символу. В начале нет предшествующего символа. – sapanoia

+1

'\ B' фактически является якорем без слов. '\ b' для границ слов. – CollinD

0

Вы можете использовать опциональный, проверьте ссылку ниже и тестов больше случаев, если это даст надлежащий выход (?): https://regex101.com/r/oP5zB8/1

(.*[^a-z]?trying[^a-z]?.*) 
+3

Здесь '. * [^ A-z]?' Так же хорош, как '. *'. – sapanoia

0

Я думаю (^|^.*[^a-z])trying([^a-z].*$|$) просто соответствует вашим потребностям.

или (?:^|^.*[^a-z])trying(?:[^a-z].*$|$) для невозвращающихся круглых скобок.

0

Вы можете попробовать следующие программы, чтобы проверить наличие на начало и конец любой строки:

package com.ajsodhi.utilities; 

import java.util.regex.Pattern; 

public class RegExStartEndWordCheck { 

    public static final String stringToMatch = "StartingsomeWordsEndWord"; 

    public static void main(String[] args) { 

     String regEx = "Starting[A-Za-z0-9]{0,}EndWord"; 
     Pattern patternOriginalSign = Pattern.compile(regEx, Pattern.CASE_INSENSITIVE); 
     boolean OriginalStringMatchesPattern = patternOriginalSign.matcher(stringToMatch).matches(); 
     System.out.println(OriginalStringMatchesPattern); 
    } 
} 
0

вы должны использовать граничное \ R'n'B, указать начало или окончание слова вместо [^ аз ], который не так логичен. Только что-то вроде

".*\\bfind\\b.*" 
Смежные вопросы