2010-03-23 3 views
3

Я знаю, что следующее работает, но это не так читаемо, есть ли способ сделать его более читаемым в коде без добавления комментария?Использует «\\» для соответствия «» с Regex в Java наиболее читаемым способом?

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

Я думаю, вы имеете в виду «\\\\» –

+14

Регулярные выражения почти всегда уродливы. Поймите это и продолжайте. –

+0

@ Саввас да, я действительно имел в виду, что спасибо, отредактировал вопрос, чтобы исправить это. –

ответ

4

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

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

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

1

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

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

Почему не

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

, так как вы просто по всей видимости, будет искать обратную косую черту?

+0

, потому что вы не всегда пытаетесь сопоставить одну косую черту. он пытался сказать, что когда вы пытаетесь что-то сопоставить с одной косой чертой, вам нужно 4 из них в строке. и он на самом деле означал обратную косую черту не вперед ... –

+0

Мой ответ по-прежнему стоит, при условии \ escaping - теперь изменился, чтобы отразить измененный вопрос. –

+0

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

2

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

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

+3

Используйте обратные ключи '' \\\\\ '' вместо '\\\\\\\\'. – BalusC

2

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

public static final String SINGLE_BACKSLASH = "\\\\";