gpt4 book ai didi

Java 正则表达式组替换,无需匹配组偏移操作

转载 作者:行者123 更新时间:2023-12-01 12:21:27 25 4
gpt4 key购买 nike

我经常面临诸如删除<p></p>之类的要求XHTML 文档中的标签,用于非常特定类型的子序列。 (不允许使用 String.replaceAll() )。通常其模式为 <p>${randomTextAndHTMLorJavascript}</p>但有一个不变的是,它总是一个任意标签,其中有很多废话,后面跟着它的结束标签。没有标签嵌套!

我的问题是,除了手动操作 Matcher 之外,是否有人知道更高级别的抽象?目的。过去我做过这些类型的替换:

  1. 将问题视为数组副本,其中我使用 StringBuilder反对并使用 Matcher.start(int)Matcher.end(int)不从输入 String 复制目标组的方法。这可行,但感觉像 C,而不是 Java。

  2. 执行一个循环,使用开始标记查找第一个标记并获取 match1.group() 的结果。作为第二个 Matcher 的输入捕获结束标记,然后使用 Matcher.replaceFirst()处理输入字符串本身的替换。这有一个缺点,需要调用 Matcher.reset()强制重修。 (我仅将其用于一次性脚本或输入集保证很小的情况下。)

  3. String.split()在一个标签上,替换它,除非与 match1 匹配并用 StringBuilder 重建字符串。运行第二个Matcher针对代表结束标记序列的标记并执行 String.replaceAll()在附加之前。

  4. 我也尝试过使用 StringBuilder.deleteCharAt()方法,但对于像 Java 这样的语言来说仍然感觉太低级。

理想的方法签名是这样的:

Matcher.replaceGroup(int targetGroup, String pattern, String replacement);

最终我希望替换 Java 中的正则表达式匹配组,而不需要使用组/数组偏移量。

最佳答案

对于 XHTML(或其他 XML)文档,一个(更多)更高级别的抽象是 XSL 转换。它们比正则表达式更具表现力和更强大,即使您确实需要处理内部结构,它们也可以工作。

或者,如果您想让逻辑更接近 Java,那么为什么不在替换字符串中使用反向引用:

Pattern pat = Pattern.compile("(<p>keep )(stuff I don't want)( this</p>)");
Matcher m = p.matcher(input);

// Replace matches to the pattern with the same thing less "stuff I don't want":
String output = m.replaceAll("$1$3");

我知道你说过你不能使用 replaceAll(),但我不清楚为什么你不能通过这种方法完全完成你在 (1) 中描述的内容(例如) .

当然,反向引用也可以与 Matcher.replaceFirst()String.replaceAll()String.replaceFirst() 配合使用。

编辑添加:

如果您想迭代地单步执行,以便在匹配时执行更多操作,那么您应该查看 Matcher.appendReplacement() (您也可以使用反向引用)并且Matcher.appendTail().

关于Java 正则表达式组替换,无需匹配组偏移操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26638426/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com