【问题标题】:Java equivalent of Perl's s/// operator?Java 等效于 Perl 的 s/// 运算符?
【发布时间】:2010-02-12 20:30:34
【问题描述】:

我有一些代码要从 Perl 转换为 Java。它大量使用正则表达式,包括s/// 运算符。我已经使用 Perl 很长时间了,但我仍然习惯于 Java 的做事方式。特别是,字符串似乎更难使用。有谁知道或拥有完全实现s/// 的Java 函数?这样它就可以处理这样的事情,例如:

$newString =~ s/(\bi'?\b)/\U$1/g;

(也许不是一个很好的例子,但你明白了。)谢谢。

【问题讨论】:

标签: java regex perl


【解决方案1】:

没有那么整洁,但在 Java 中,您可以使用 String.replaceAll() 或使用 Pattern 来执行以下操作:

Pattern p = Pattern.compile("(\bi'?\b)");

Matcher m = p.matcher(stringToReplace);
m.replaceAll("$1");

查看 Pattern 文档以了解 Java 的正则表达式语法——它与 Perl 不完全重叠。


要获得大写,请查看Matcher.appendReplacement

StringBuffer sb = new StringBuffer();
while (m.find()) {
    String uppercaseGroup = m.group(1).toUpperCase();
    m.appendReplacement(sb, uppercaseGroup);
}
m.appendTail();

不像上面提到的 jakarta-oro 库那样接近 Perl,但肯定是在库中内置了一些帮助。

【讨论】:

    【解决方案2】:

    看看 String 的replaceAll(...) 方法。请注意,Java 不支持 \U(大写)功能。

    【讨论】:

    • 谢谢。我还找到了 Matcher.replaceAll()。不过,它们是否足够强大,可以处理我升级比赛的例子......?
    • Matcher.replaceAll()StringreplaceAll() 使用。所以这回答了你的另一个问题:不,不支持\U
    • 我错过了您回复的 \U 部分。我想我必须接受 replaceAll() 将适用于大多数但不是所有情况。
    • 强调一下:不仅replaceAll(...)不支持,整个Java regex包都不支持。
    • 再次感谢 Bart(也感谢其他所有人;我的第一个问题!)。
    【解决方案3】:

    给定一个 String 类的实例,您可以像这样使用 .replaceAll() 方法:

    String A = "Test";
    A.replaceAll("(\bi'?\b)","\U$1");
    

    编辑 - 好吧太慢了。根据另一个答案,显然不支持 \U。

    注意 - 我不确定贪婪符号是如何翻译的,如果您特别需要,您可能想尝试查看 Java 的实现。

    【讨论】:

    • 替换字符串中的 \U 将导致抛出 RuntimeException。
    • 谢谢。除了 Java 中的额外反斜杠之外,regexp 语法的相同程度给我留下了深刻的印象。 (不过,\U 太糟糕了。)我希望 Java 的字符串处理更像 Perl 的......
    • 在字符串操作方面,Perl 是王道。但是,是的,Java 的正则表达式实现是一个可靠而强大的实现,尽管有时会因为所有反斜杠和对象创建而显得冗长。
    • \U 在 perl 中并不是真正的正则表达式语法,它是双引号字符串语法。
    猜你喜欢
    • 2012-01-24
    • 2012-12-29
    • 1970-01-01
    • 2019-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-09
    • 2018-05-30
    相关资源
    最近更新 更多