Я пытаюсь сопоставить все экземпляры слова, которые не имеют прикрепленного префикса или суффикса, в основном любого экземпляра слова, которому предшествует пробел или появляется в начале строки, за которым следует либо пробел, либо пробел знаки препинания. Следующее должно соответствовать:
"This is the word."
"word is this."
И следующее не должно:
"This is preword."
"wordness is this."
Моим первоначальным решением было следующее:
(^|\\s)word(\\s|,|\\.)
Но он не фиксирует случай, когда слово появляется в начале строки. Как я могу правильно использовать карат для этого?
Кажется, что вы ищете границы слов \b
.
Возможная проблема, с которой вы сталкиваетесь, заключается в том, что регулярное выражение, подобное \sword\s
будет потреблять пробелы вокруг искомых слов, поэтому эти пробелы не будут использоваться повторно, чтобы найти следующее слово после согласования.
пример
foo foo foo foo foo
Если вы хотите найти foo
который мог бы, например,
поэтому regex может выглядеть как (^|\\s)foo(\\s|$)
вы бы соответствовали
foo foo foo foo foo
^^^^ ^^^^^ ^^^^
второй foo
не будет сопоставлен, потому что пространство до того, как оно уже было использовано совпадением первого foo
,
foo foo foo foo foo
X^^^^ cant use space marked with 'X'
поэтому следующая подстрока будет
foo foo foo foo foo
^^^^^
а потом
foo foo foo foo foo
^^^^
Для решения этой проблемы вы можете использовать \b
который представляет собой место между символами из \w
(az
AZ
0-9
и _
) и любым символом, который не находится в \w
.
Поэтому попробуйте с помощью \bword\b
вместо этого (который в \bword\b
Java должен быть записан как "\\bword\\b"
)
Кстати, вы, вероятно, должны окружить свое слово цитатой \Q...\E
если она содержит специальные символы регулярных выражений.
Поэтому ваше регулярное выражение может выглядеть как "\\b\\Qword\\E\\b"
.
Java regex поддерживает границу слова \b
metacharacter:
\bword\b
Обратите внимание, что Java примет любой действительный символ Юникода для слова.
word
то вам нужно указать конечный шаблон$