2013-03-07 7 views
2

Я использую Java. Мне нужно разобрать следующую строку, используя регулярное выражение:Строка parse regex в java

<actions>::=<action><action>|X|<game>|alpha 

Это должно дать мне маркеры <action>, <action>, X и <game>

Какой регулярное выражение будет работать?

Я пытался как-то: "<[a-zA-Z]>", но это не заботится о X или alpha.

+1

Если это соответствует 'alpha' или нет ? –

+0

Да, он также должен включать альфу. – Dev

ответ

5

Вы можете попробовать что-то вроде этого:

String str="<actions>::=<action><action>|X|<game>|alpha"; 
str=str.split("=")[1]; 
Pattern pattern = Pattern.compile("<.*?>|\\|.*?\\|"); 
Matcher matcher = pattern.matcher(str); 
while (matcher.find()) { 
    System.out.println(matcher.group()); 
} 
+0

включает X с | X |. regex следует игнорировать | – Dev

0

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

String pattern="<actions>::=<(.*?)><(.+?)>\|(.+)\|<(.*?)\|alpha"; 

Для кода Java вы можете использовать шаблон и Искателя: здесь есть основная идея:

Pattern p = Pattern.compile(pattern, Pattern.DOTALL|Pattern.MULTILINE); 
    Matcher m = p.matcher(text); 
    m.find(); 
    for (int g = 1; g <= m.groupCount(); g++) { 
     // use your four groups here.. 
    } 
+0

Подождите, почему здесь альфа жестко закодирована. Да, он должен включать «<" and ">», а также слова, которые не содержат эти «<" and ">». В приведенном выше примере токены должны быть , , X, , alpha. – Dev

1

Вы должны иметь что-то вроде этого:

String input = "<actions>::=<action><action>|X|<game>|alpha"; 
Matcher matcher = Pattern.compile("(<[^>]+>)(<[^>]+>)\\|([^|]+)\\|(<[^|]+>)").matcher(input); 
while (matcher.find()) { 
    System.out.println(matcher.group().replaceAll("\\|", "")); 
} 

Вы не specefied если вы хотите вернуть alpha или нет, в этом случае он не возвращает его.

Вы можете вернуть альфу, добавив |\\w* в конец регулярного выражения, которое я написал.

Это вернет:

<action><action>X<game> 
+0

шаблон не должен включать «|». это выплевывает: токен: токен: токен: токен: | X | token: Dev

+0

Один из способов удаления '|' такой же, как и в отредактированном сообщении. – Maroun

+0

Можете ли вы также сказать мне, как это сделать: :: = action. Здесь нет «|» и вам нужно получить токены , , и действие? Благодарю. – Dev

0

Вы можете использовать следующие Java регулярное выражение:

Pattern pattern = Pattern.compile 
     ("::=(<[^>]+>)(<[^>]+>)\\|([^|]+)\\|(<[^>]+>)\\|(\\w+)$"); 
+0

nope не работает – Dev

+0

@Dev Смотрите демо-версию здесь: http://regex101.com/r/uU2fT9 – anubhava

+0

@Dev: Или посмотрите код Java с приведенным выше регулярным выражением: http://ideone.com/8b7DP0 – anubhava