Метасимвол Java RegEx (.) И обычная точка?


150

В Java RegEx, как узнать разницу между .(точкой) метасимвола и обычной точкой, которую мы используем в любом предложении. Как справиться с такой ситуацией для других метасимволов, например ( *,+ , \d, ...)

Ответы:


276

Если вы хотите, чтобы точка или другие символы со специальным значением в регулярных выражениях были нормальным символом, вы должны экранировать их обратной косой чертой. Поскольку регулярные выражения в Java являются обычными строками Java, вам необходимо экранировать саму обратную косую черту, поэтому вам нужно две обратные косые черты, например\\.


1
это исправление также относится к bash
krivar

18
Помните, что экранирование от обратной косой черты зависит от того, как вы используете регулярное выражение. если вы жестко закодированы, вам нужно использовать: "\\." , если вы читаете из необработанного источника (например, из текстового файла), вы используете только одну обратную косую черту: \.
Пол

25

Решения, предложенные другими участниками, не работают для меня.

Но я нашел это:

чтобы избежать точки в Java регулярное выражение записи [.]


2
То же самое, \\.у меня не сработало: \.жаловался, что .не нужно убегать, \\.заставлял думать, что это \.вместо того ., \\\.и строитель сгенерировал ошибку, [.]было единственным, что сработало.
Mithunc

1
@mithunc Странно, \\.внутри строкового литерала вы \.получаете то, что нужно регулярному выражению, чтобы увидеть точку как буквальную точку вместо сопоставления с любым символом.
Клар

16

Регулярные выражения в стиле Perl (на которых более или менее основан механизм регулярных выражений Java) обрабатывают следующие символы как специальные символы:

.^$|*+?()[{\имеют особое значение вне классов персонажей,

]^-\имеют особое значение внутри классов символов ( [...]).

Таким образом, вам нужно избегать этих (и только тех) символов в зависимости от контекста (или, в случае классов символов, размещать их в положениях, где они не могут быть неверно истолкованы).

Излишне экранирование других символов может работать, но некоторые движки регулярных выражений будут воспринимать это как синтаксические ошибки, например \_, приведет к ошибке в .NET.

Некоторые другие приведут к ложным результатам, например \<, интерпретируется как литерал <в Perl, но в egrepнем означает «границу слова».

Поэтому пишите -?\d+\.\d+\$для соответствия 1.50$и -2.00$т. Д. И [(){}[\]]для класса символов, который соответствует всем видам скобок / скобок / скобок.

Если вам нужно преобразовать строку ввода пользователя в форму, безопасную для регулярных выражений, используйте java.util.regex.Pattern.quote.

Дальнейшее чтение: блог Яна Гойварта RegexGuru об экранировании метасимволов


4

Избегайте специальных символов с обратной косой чертой. \., \*, \+, \\d, И так далее. Если вы не уверены, вы можете избежать любого не алфавитного символа, является ли он специальным или нет. См. Javadoc для java.util.regex.Pattern для получения дополнительной информации.


Исключение ненужных символов без необходимости может сработать на некоторых языках, но может не сработать на других, поэтому лучше не привыкать.
Тим Пицкер

1
Этот вопрос, в частности, касается Java, и docs.oracle.com/javase/6/docs/api/java/util/regex/… говорит: « Обратная косая черта может использоваться до не алфавитного символа, независимо от того, является ли этот символ часть неуправляемой конструкции ".
Христоффер Хаммарстрем

2

Вот код, который вы можете напрямую скопировать вставить:

String imageName = "picture1.jpg";
String [] imageNameArray = imageName.split("\\.");
for(int i =0; i< imageNameArray.length ; i++)
{
   system.out.println(imageNameArray[i]);
}

А что, если по ошибке остаются пробелы до или после "." в таких случаях? Всегда лучше учесть и эти пробелы.

String imageName = "picture1  . jpg";
String [] imageNameArray = imageName.split("\\s*.\\s*");
    for(int i =0; i< imageNameArray.length ; i++)
    {
       system.out.println(imageNameArray[i]);
    }

Здесь \\ s * здесь, чтобы рассмотреть пробелы и дать вам только необходимые разделенные строки.


1

Я хотел сопоставить строку, которая заканчивается на ". *" Для этого мне пришлось использовать следующее:

"^.*\\.\\*$"

Какая глупость, если вы думаете об этом: D Вот что это значит. В начале строки может быть любой символ ноль или более раз, за ​​которым следует точка "." сопровождаемый звездой (*) в конце последовательности.

Надеюсь, это кому-нибудь пригодится. Спасибо за обратную косую черту Фабиану.


Просто используйте "\\.\\*$"тогда. Не нужно совпадать с началом строки, если это не имеет значения для вас.
Ophidian

Да вы правы. Если честно, я не могу вспомнить вариант использования для этого: /
Atspulgs

Не было на самом деле , чтобы помочь вам , но и помогать другим , глядя на ваш пост: P
Ophidian

0

Если вы хотите закончить, проверьте, заканчивается ли ваше предложение ". ", Тогда вам нужно добавить [\. \ ] $ В конец вашего шаблона.


0

Я делаю некоторый базовый массив в JGrasp и обнаружил, что с помощью метода доступа для массива char [] [], чтобы использовать ('.') Для размещения одной точки.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.