通过带条件的新行拆分字符串

eagi6jfj  于 2021-07-08  发布在  Java
关注(0)|答案(1)|浏览(285)

我正试着把一根绳子 \n 只有当它不在我的“动作块”中时。
下面是一个文本示例 message\n [testing](hover: actions!\nnew line!) more\nmessage 我想分开当 \n 不在房间里 [](this \n should be ignored) ,我为它做了一个正则表达式,你可以在这里看到https://regex101.com/r/rpaq2h/1/ 在这个例子中,它似乎工作正常,所以我接着用java实现了:

final List<String> lines = new ArrayList<>();
final Matcher matcher = NEW_LINE_ACTION.matcher(message);

String rest = message;
int start = 0;
while (matcher.find()) {
    if (matcher.group("action") != null) continue;

    final String before = message.substring(start, matcher.start());
    if (!before.isEmpty()) lines.add(before.trim());

    start = matcher.end();
    rest = message.substring(start);
}

if (!rest.isEmpty()) lines.add(rest.trim());

return lines;

这应该忽略任何 \n 如果它们在上面显示的模式中,那么它就永远不会匹配“action”组,就像它被添加到java和 \n 是现在,它永远不会匹配它。我有点搞不懂为什么,因为它在regex101上运行得很好。

7vux5j2d

7vux5j2d1#

而不是检查组是否 action ,您可以简单地使用regex替换组 $1 (第一个捕获组)。
我还把你的正则表达式改成了 (?<action>\[[^\]]*]\([^)]*\))|(?<break>\\n) 作为 [^\]]* 不会倒退( .*? 回溯并导致更多步骤)。我也对她做了同样的事 [^)]* .
看到这里的代码了吗

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Main {

    public static void main(String[] args) {

        final String regex = "(?<action>\\[[^\\]]*\\]\\([^)]*\\))|(?<break>\\\\n)";
        final String string = "message\\n [testing test](hover: actions!\\nnew line!) more\\nmessage";

        final Pattern pattern = Pattern.compile(regex);
        final Matcher matcher = pattern.matcher(string);

        final String result = matcher.replaceAll("$1");

        System.out.println(result);

    }

}

相关问题