java - 拆分具有特定格式的一些文本

标签 java

我需要一些关于以下问题的建议。我收到以下格式的文本:

"text (textInBrackets), text2 (textInBrackets2), text3 (textInBrackets3),..."

每个文本和 textInBrackets 都可以有字母、数字和括号。对之间的分隔是逗号,逗号附近的右括号是确定对中正确元素结束位置的括号。

我需要以一种可以将每对文本和 textInBrackets 分开并将其放入数组中的方式拆分文本,例如:

String[][] pairs= new String[n][2];
pair[0][0]="text";
pair[0][1]="textInBrackets";
pair[1][0]="text2";
pair[1][1]="textInBrackets2";

例子:

String text="texttext(text)text(subtext), othertext152(de)sert(subothertext), textwithoutbracket, elems(subelem)";

String[][] return=splitFunction(text);

The return array is:
    String[][] pairs= new String[n][2];
    pair[0][0]="texttext(text)text";
    pair[0][1]="subtext";
    pair[1][0]="othertext152(de)sert";
    pair[1][1]="subothertext";
    pair[2][0]="textwithoutbracket";
    pair[2][1]=null;
    pair[3][0]="elems";
    pair[3][1]="subelem";

我已经有了解决问题的方法,但不是防弹的,而且有一些错误。

最佳答案

你试图实现的实际上是一个很难实现的问题(如果括号内的括号文本必须包含在内,例如“(sa(ssa)sa)”)。如果您的情况是括号内的文本不能包含括号内的其他文本等..解决方案将非常简单,因为人们已经向您提出了建议。验证这种模式并从中获取组的代码如下所示:

String text = "text (textInBrackets), text2 (textInBrackets2), text3 (textInBrackets3)";
Pattern pattern = Pattern.compile("(\\w+ \\(\\w+\\))((, \\w+ \\(\\w+\\))*)");
Matcher matcher = pattern.matcher(text);
System.out.println(matcher.matches());
System.out.println(matcher.group(0));
System.out.println(matcher.group(1));
System.out.println(matcher.group(2));
System.out.println(matcher.group(3));

输出:

true
text (textInBrackets), text2 (textInBrackets2), text3 (textInBrackets3)
text (textInBrackets)
, text2 (textInBrackets2), text3 (textInBrackets3)
, text3 (textInBrackets3)

但是你也有说明括号内的文本可能包含括号内的另一个文本等..(我不知道它是否必须再次成为闭括号文本,如果不是,继续的内容对你无效案件)。这样的文本不再是常规语法(可以用正则表达式解析)而是上下文无关语法。要验证和解析此类文本,您需要使用带堆栈的实现,一旦找到它,您将插入左括号并弹出右括号。这实际上是能够解析上下文无关语法的下推自动机所做的。如果您知道括号内的文本可以嵌套多少次,您的文本仍将是常规有效语法。

例如:

"text (sad(sdasddsa)sadas)"

你知道括号文本最多嵌套 1 次,你可以调整你的手动实现或正则表达式来适应它。这样的模式看起来像这样(可能会完全不同,这取决于您希望它的行为方式,如果空括号也有效或没有等等...):

Pattern pattern = Pattern.compile("(\\w+ \\(\\w+(\\(\\w*\\))*\\w+\\))((, \\w+ \\(\\w+(\\(\\w*\\))*\\w+\\))*)");

您可以看到我必须调整我的模式,以便它包含有关嵌套括号的信息。你可以这样做 X 次,但不能永远这样做。这正是这个问题失去其常规语法行为并成为上下文无关语法的地方。

一旦您没有关于嵌套级别的信息(并且可以有 N 个嵌套级别),您需要使用上下文无关语法(或下推自动机)。因为这是一个很难解释的话题,因为需要接受一些关于自动机理论、语法、正则表达式与常规语法的关系等的理论教育……我建议你学习一些背景知识来理解我的回答。如果您没有太多时间来解决这个问题,只需向要求您实现我提供的参数的人提供并实现您的程序以使用最大嵌套级别 1 的嵌套括号。

关于java - 拆分具有特定格式的一些文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63076337/

相关文章:

java.lang.SecurityException : Cannot set up certs for trusted CAs (JBoss AS 7)

java - Android Eclipse - 找不到 *.apk

用于排序的 Java Double NaN 比较

java - 使用此运算符通过接口(interface)强制转换实现的类

java - primefaces 面包屑不适用于 ui :repeat

java - 将 Jtext 区域的精确文本写入文件

java - 在 MikroTik Winbox 的注册表编辑器中添加自定义协议(protocol)

java - QueryDsl - 如何使用排序和分组表创建内部联接

java - hornetq "listMessagesAsJson"不工作

java - Web服务请求执行时间计算