使用Regex将嵌套字符与其含义匹配



首先,对于正则表达式,我还是个孩子。

我需要将嵌套字符与其存储在数组中的含义进行匹配。

例如,给定这个字符串

{(((x)))}

我需要使用Regexp或oldschool for loops将其转换成这个

在大括号内,在三个括号内,一个x标记,由三个括号关闭,由大括号关闭

问题是我需要解析许多嵌套的字符,包括unicode符号,我想知道是否有使用正则表达式的最佳实践。

进一步例子:

输入字符串将始终是回文。

{(#x#)} 
{{{{*}}}}
<<<x>>>

将从静态数组

转换为它们的定义。
String[][] openers = { {"{","curly"} , {"(","parenthesis" }, {"<","inequality"} };
String[][] insiders = { {"x","x mark"}, {"#","pound"}, {"*","star"} };

到这些

大括号x标记大括号大括号

4大括号* 4大括号

三不等式x标记三不等式

这将在Java中完成。

我不会使用正则表达式,而是使用一个简单的"map"代替,String -> String,类似于:

Map<String,String> explanations = new HashMap<String,String>();
explanations.put("{","inside curly braces");

然后你可以在给定的字符串上实现一个简单的迭代,它接受单个字符并转换它们。

要实现"在三个括号内",您可以使用Java国际化系统,因此您可以编写"在{0}括号内",然后,在解析器中,当您不止一次遇到相同的字符时,增加计数器并使用它来正确格式化字符串。考虑到语法非常强大,您可以轻松地处理单数、复数等。

你不能用正则表达式匹配嵌套的括号,它不够强大,因为它没有堆栈。

我建议使用递归下降解析器进行临时解析。

或者更简单的方法是迭代地删除嵌套,像这样:

for (...) {
   String s = s.replaceAll("\(.*\)", "$1")
   // do something
}

最新更新