2010-03-21 3 views
2

Мне нужно создать регулярное выражение для некоторого преобразования пути. Пример пути являютсяjava regular expression

//name:value /name:value // name:value 
/name:value /name:value 
/name:value//name:value 

вещь, как проверить ///или в начале или в середине строки и как я могу указать, что имя может содержать любое из этого A-Za-Z и _

Путь также содержит пробелы.

ответ

4

Это должно помочь:

String s = "//name:value /name:value // name:value"; 
Pattern p = Pattern.compile("//?\\s*(\\w+):(\\w+)\\s*"); 
Matcher m = p.matcher(s); 
while (m.find()) { 
    System.out.printf("%s = '%s'%n", m.group(1), m.group(2)); 
} 

Некоторые примечания:

  • Это считается, что / или // могут разграничить name:value пары;
  • Дополнительное свободное пространство после / или // и после name:value игнорируется;
  • И name, и value сняты. Вы не говорите, что хотите захватить. При необходимости скорректируйте скобки;
  • Оба name и value состоят из A-Z, a-z, 0-9 или _ (это то, что означает \w).

Если вы не хотите, чтобы найти значения, а просто проверить действительность в целом:

String s = "//name:value /name:value // name:value"; 
if (s.matches("(//?\\s*\\w+:\\w+\\s*)+")) { 
    // it fits 
} 
1

Что exaclty вы хотите АРХИВ? Вы просто хотите проверить, является ли вход допустимым путем, или вы хотите извлечь любые согласованные группы для дальнейшего преобразования?

В любом случае модель, которая будет соответствовать строке, начиная с/или // и имя и значение, состоящее из A-Za-Z и _ бы:

(//?\s*[A-Za-z_]+:[A-Za-z_]+\s*)+ 
0

Вы можете также использовать replaceAll для сделайте преобразование, если оно достаточно простое.

String strings = "//cello:Yo-Yo Ma/violin : Itzhak Perlman"; 
    System.out.println(strings.replaceAll(
     "//?\\s*(\\w+)\\s*:\\s*(.*?)\\s*(?=/|$)", 
     "[$2] on [$1]\n" 
    )); 
    // "[Yo-Yo Ma] on [cello]" 
    // "[Itzhak Perlman] on [violin]"