Использование «\\\\» для сопоставления «\» с Regex в Java является наиболее читабельным способом? - PullRequest
3 голосов
/ 24 марта 2010

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

//Start her off
String sampleregex = "\\\\";
if (input.matches(sampleregex))
   //do something
//do some more

Ответы [ 5 ]

6 голосов
/ 24 марта 2010

Почему бы не

if (input.contains("\\")) {
}

так как вы, кажется, просто ищете обратную косую черту?

4 голосов
/ 24 марта 2010

Предполагая, что вы имеете в виду "\\\\" вместо "////":

Вы можете избежать этого с помощью \Q и \E, которые удаляют один слой обратной косой черты: "\\Q\\\E", но это не намного лучше. Вы также можете использовать Pattern.quote("\\") для экранирования во время выполнения. Но лично я бы просто придерживался "\\\\".

(Кроме того, вам нужно четыре из них, потому что \ используется для экранирования вещей как в движке regex, так и в Java Strings, поэтому вам нужно выйти один раз, чтобы движок regex знал, что вы не пытаетесь скрыть что-нибудь еще (так что это \\); тогда вам нужно экранировать оба из них, чтобы Java знала, что вы не экранируете что-то в строке (так что это \\\\)).

2 голосов
/ 24 марта 2010

Мое решение похоже на Soldier.moth, но с изюминкой. Создайте файл констант, который содержит общие регулярные выражения и продолжайте добавлять к нему. Выражения как константы могут даже комбинироваться, обеспечивая уровень абстракции для построения регулярных выражений, но в конце они все еще часто оказываются грязными.

public static final String SINGLE_BACKSLASH = "\\\\";
2 голосов
/ 24 марта 2010

/ не является метасимволом регулярного выражения, поэтому строка регулярного выражения "/" соответствует одиночной косой черте, а "////" соответствует четырем подряд.

Я полагаю, что вы хотели спросить о сопоставлении одной обратной косой черты, а не прямой косой черты, в этом случае нет, вам нужно поместить "\\\\" в строковый литерал регулярного выражения, чтобы соответствовать единственной обратной косой черте. (И мне нужно было ввести восемь, чтобы четыре показались на ТАК - черт!)

1 голос
/ 24 марта 2010

Единственное решение, о котором я подумал, это сделать

String singleSlash = "\\\\";
if(input.matches(singleSlash))
   //...
...