2015-02-09 4 views
0

В настоящее время я следующий код:Java разделить строку, чтобы получить только буквенно-цифровые символы (но не альфа- или числовой)

String test = "=(7+A15)-5"; 
if(test.matches(".*[A-z]+[0-9]+.*")){ 
    String spl[] = test.split("((?<=[A-z]{1,4}[0-9]{1,4})|(?=[A-z]{1,4}[0-9]{1,4}))",3); 
    System.out.println(spl[0] + "\n" + spl[1] + "\n" +spl[2]);    
} 

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

=(7+ 
A1 
5)-5 

Кроме того, что я хочу:

=(7+ 
A15 
)-5 

Но я понятия не имею, почему он получает только один номер, когда я спрашиваю {1,4}

+2

'[Az]' включает символы ' '[', '\\', ']', '^',«_ ', 'и' '\' ''. Нет смысла обматывать строку в 'new String (" foo ")'. –

+0

Каков диапазон буквенно-цифровых маркеров (из вашего регулярного выражения будет видно, что вы ищете от 1 до 4 {1,4} за альфа и {1,4} за числовые. Будет ли ABCD1234 действительным, но ABCDEF12345 NOT? – gtgaxiola

+0

Точно , ABCD1234 действительно, в то время как ABCDEF ... не – Naouk

ответ

0

Я хотел бы использовать разделитель, такие как

String delimiter = "[a-zA-Z]{1,4}[0-9]{1,4}"; 

Тогда сделайте как в lookahead и lookbehind для того, чтобы захватить разделитель, а также маркер, которые вы хотите разделить.

//Lookahead and lookbehind where %1 is the delimiter 
String WITH_DELIMITER = "((?<=%1$s)|(?=%1$s))"; 
String regex = String.format(WITH_DELIMITER, delimiter); 

Так как кажется, группа захвата разделяет момент регулярное выражение сопоставляются

Пример: A15 разбивается на A1 и 5

Вы должны перебрать свои маркера для конкатенации этих маркеров, на самом деле являются разделителями (с использованием другого брака)

String matcher = "[a-zA-Z]*[0-9]+"; 
String[] s = text.split(regex); 
List<String> result = new ArrayList<>(); 
String tmp = ""; 
for (String x : s) { 
    if (x.matches(matcher)) { 
     tmp += x; 
    } else { 
     if (!tmp.isEmpty()) { 
      result.add(tmp); 
      tmp = ""; 
     } 
     result.add(x); 
    } 
} 
if(!tmp.isEmpty()) { 
    result.add(tmp); 
} 

Собираем все вместе:

public static List<String> splitWithDelimiter(String text, String delimiter) { 
    String WITH_DELIMITER = "((?<=%1$s)|(?=%1$s))"; 
    String regex = String.format(WITH_DELIMITER, delimiter); 
    String matcher = "[a-zA-Z]*[0-9]+"; 
    String[] s = text.split(regex); 
    List<String> result = new ArrayList<>(); 
    String tmp = ""; 
    for (String x : s) { 
     if (x.matches(matcher)) { 
      tmp += x; 
     } else { 
      if (!tmp.isEmpty()) { 
       result.add(tmp); 
       tmp = ""; 
      } 
      result.add(x); 
     } 
    } 
    if(!tmp.isEmpty()) { 
     result.add(tmp); 
    } 
    return result; 
} 

public static void main(String[] args) { 
    String test = "=(7+A185)-5"; 
    String delimiter = "[a-zA-Z]{1,4}[0-9]{1,4}"; 
    List<String> s = splitWithDelimiter(test, delimiter); 
    for (String x : s) { 
     System.out.println(x); 
    } 
} 

Какие выходы:

=(7+ 
A185 
)-5