当前位置: 首页 > 知识库问答 >
问题:

用流替换正则表达式

唐涛
2023-03-14

通过好奇心,有没有办法用Java Stream编写它?

private final static Pattern decodePattern = Pattern.compile("&#(\\d+);");

StringBuffer buf = new StringBuffer();

Matcher m = decodePattern.matcher(somestring);
while (m.find()) {
    m.appendReplacement(buf, String.valueOf((char) Integer.parseInt(m.group(1))));
}
m.appendTail(buf);

String decodeString = buf.toString();

共有1个答案

龙志勇
2023-03-14

使用Matcher类中的重载Java 9方法可以实现更干净的代码:
public String replaceAll​(功能

StringBuffer sb = new StringBuffer();
while(matcher.find()){
    matcher.appendReplacement(sb, /*create replacement*/);
}
matcher.appendTail(sb);
String result = sb.toString;

String replaced = matcher.replaceAll(match -> /*create replacement*/);

例如

String replaced = Pattern.compile("\\b\\w")
                         .matcher("foo bar baz")
                         .replaceAll(match -> match.group().toUpperCase());
//replaced: "Foo Bar Baz"

还增加了对元素流匹配模式的支持:< code>public Stream

//BTW Java 9 provides support for StringBuilder beside StringBuffer 
//for appendReplacement/appendTail

Matcher matcher = ...
StringBuilder buf = new StringBuilder(); 

matcher.results()
       .map(result -> String.valueOf((char) Integer.parseInt(result.group(1))) )
       .forEach(replacement -> matcher.appendReplacement(buf, replacement));
matcher.appendTail(buf);

String decodeString = buf.toString();

所以看起来没干净多少。

在Java8中,Pattern和Matcher类在流支持方面没有太大变化。只有Pattern收到了public Stream

如果您想简化Java 8中的代码,请编写自己的方法,在该方法中,您将提供匹配器和函数来映射匹配的内容(最好由MatchResult或Matcher表示,以便它可以访问< code >组(...) methods)来替换应该放进去的东西。

这种方法可能看起来像:

public static String replaceMatches(Matcher m, Function<MatchResult, String> mapping){
    
    StringBuffer sb = new StringBuffer();
    while(m.find()){
        MatchResult matchResult = m.toMatchResult();
        m.appendReplacement(sb, mapping.apply(matchResult));
    }
    m.appendTail(sb);
    
    return sb.toString();
}

你可以这样使用它:

Pattern p = Pattern.compile("\\b\\w");
Matcher m = p.matcher("foo bar baz");

String result = replaceMatches(m, mr -> mr.group().toUpperCase());

System.out.println(result);

结果:< code>Foo Bar Baz

 类似资料:
  • 问题内容: 我需要替换字符串的一部分。我浏览了Python文档并发现了re.sub。 我期望这能打印,而不是“酒吧”。 谁能告诉我我做错了什么? 问题答案: 除了捕获要 替换 的零件外,您还可以捕获要 保留 的零件,然后使用引用对其进行引用以将它们包括在替换字符串中。 尝试以下方法: 另外,假设这是HTML,则应考虑使用HTML解析器来执行此任务,例如Beautiful Soup 。

  • Change is inevitable, except from vending machines. — Robert C. Gallagher Puppet 的 regsubst 函数提供了一种处理文本的简单方法, 用于在字符串中查找和替换,或者从字符串提取匹配的模式。 例如,我们通常需要对从 facter 或者从外部程序获得的数据做这样的处理。 在本例中将会看到如何使用 regsubst 提

  • 问题内容: 我有这个字符串: 现在,我想在每个数字之前添加String num:。 因此结果必须是: 这也必须工作: 用于搜索数字的正则表达式是:[0-9]+ 但是我想用num:+ [匹配的子字符串]替换匹配的子字符串。 我现在写了一个带有数字的示例,但另一个示例可以是:在每个电子邮件地址之前添加 ·Email found·: 问题答案: 利用分组。您可以使用括号(并)定义组,并通过组索引$n在哪

  • 我想以firstName和lastname的形式获得输出。怎么用正则表达式做,有什么想法吗?

  • 问题内容: 我已将一些定价数据读入pandas数据框中,其值显示为: 我想将其简化为数字值。我知道我可以遍历并应用正则表达式 到每个字段,然后将结果列表重新组合在一起,但是有没有一种循环的方式? 谢谢 问题答案: 您可以使用删除所有非数字: regex101演示

  • 下面就来详细介绍Notepad++中关于正则表达式的部分,主要是查找和替换。 对于替换功能,一般的文本编辑器,都具有此功能,但是对于高级的正则表达式替换,则很多都不支持。而此处Notepad++支持此功能。 正则表达式的替换,在很长一段时间内,我都没有用到过。而后来有此需求的时候,由于不熟悉,导致也没去折腾具体如何使用的。 后来有空去弄了下,终于搞懂了。对此类功能不了解的人,会没啥感觉,但是看了下