LINUX.ORG.RU

Java разбор строки по regexp


0

1

Можно ли с помощью каких-либо встроенных инструментов в Java извлечь из строки {{#функция: аргумент1|аргумент2|аргумент3| ...}} название функции, аргументы и т.д.? между разделителями может быть любое количество пробелов, поэтому, нужно регулярное выражение Спасибо.

Ответ на: комментарий от theos

Я делаю это примерно так, хотелось бы более просто

inputString = inputString.substring(inputString.indexOf("{{")+2, inputString.lastIndexOf("}}"));
String[] splitted = inputString.split("\\|");
if(Pattern.compile("((.)*)if([([\\s]*)\\:])((.)*)").matcher(splitted[0]).matches()) {
	return (matcherIf(splitted[0]))?splitted[1]:splitted[2];
}

JIesnik
() автор топика
Ответ на: комментарий от anonymous

Ох, поспешил.

Pattern p = Pattern.compile("(\\{{2})([a-zA-Z]*)\\:\\s*([a-zA-Z]*|[0-9]*|\\||\\s*)+(\\}{2})")
Matcher m = p.matcher(targetStr)
m.group(...)
[[/code]]

anonymous
()

Скорее даже так

String Name="";
List<String> Arguments = new ArrayList<String>();

Pattern CompleteFunction = Pattern.compile("\\{\\{(#[a-zA-Z_]\\w*+):\\s++([a-zA-Z_]\\w*+(?:\\s*+\\|\\s*+[a-zA-Z_]\\w*+)*+)\\s*+\\}\\}");
Pattern Parameter = Pattern.compile("[a-zA-Z_]\\w*+");
Matcher CFMatcher = CompleteFunction.matcher(subjectString);
if (CFMatcher.find()) {
	Name = CFMatcher.group(1);
	Matcher PMatcher = Parameter.matcher(CFMatcher.group(2));
	while (PMatcher.find()) {
		Arguments.add(PMatcher.group());
	} 
} 
Uter
()
Ответ на: комментарий от Uter

Ой, это конечно не проще, но, кажется, более полно. А вообще регекспы - такая вещь, где «проще» не бывает

Uter
()

>поэтому, нужно регулярное выражение

А не проще взять подстроку с 2-го по -3-й символ и сделать ей split по '|'? Первый элемент массива — функция, остальное — аргументы.

KRoN73 ★★★★★
()
Ответ на: комментарий от JIesnik

Со второго по минус второй и trim()

Или может быть и «{ {»? :)

KRoN73 ★★★★★
()

а не проще воспользоваться commons-cli ? Не знаю, подходит ли это к Вашей задаче.

JFreeM ★★★☆
()
Ответ на: комментарий от JIesnik

fixed

\\{\\{(#[a-zA-Z_]\\w*+)\\s*+:\\s*+([a-zA-Z_]\\w*+(?:\\s*+\\|\\s*+[a-zA-Z_]\\w*+)*+)\\s*+\\}\\}"

Uter
()

Можно например так:

import java.util.*;
import java.util.regex.*;

public class Parser {
	public static void main(String[] args) {
		String in = "{{#addition: 44|  a|  b  | 546 }}";
		Parser.parse(in).print();
	}

	public static FunExpression parse(String in) {
		in = in.substring(3, in.length() - 3);
		String[] chunks = in.split("[:|]");

		for (int i = 0; i < chunks.length; i++)
			chunks[i] = chunks[i].trim();

		return new FunExpression(chunks[0], Arrays.copyOfRange(chunks, 1, chunks.length));
	}
}

class FunExpression {
	private String name;
	private String[] args;

	public FunExpression(String name, String[] args) {
		this.name = name;
		this.args = args;
	}

	public void print() {
		System.out.print(name + ": ");
		for (String arg : args)
			System.out.print(arg + " << ");
	}
}
jroom36
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.