【问题标题】:regular expression replace 2 characters with one正则表达式用一个替换 2 个字符
【发布时间】:2012-10-12 04:12:53
【问题描述】:

我想使用正则表达式来解决以下问题:

SOME_RANDOM_TEXT

应转换为:

someRandomText

所以,_(any char) 应该只替换为大写字母。我发现了类似的东西,使用tool:

_\w and $&

如何仅从替换中获取第二个字母?有什么建议吗?谢谢。

【问题讨论】:

  • 有些语言有允许你修改反向引用的标志(例如,\u 将相邻的反向引用转换为小写),我不知道你在java中是否有这个
  • 如果正则表达式是一个选项,您将在正则表达式中使用_([A-Za-z])_(\p{L}),在替换字符串中使用$1。括号捕获组 #1 中的字母(假设它是第一组括号),$1 在替换字符串中充当该组的占位符。 (\w 不正确,因为它除了匹配字母之外还匹配数字和下划线,\p{L}[A-Za-z] 更正确,因为它匹配 Unicode 字母,而不仅仅是 ASCII。)

标签: java regex string


【解决方案1】:

简单地String.split("_") 然后重新加入可能更容易,将集合中每个字符串的第一个字母大写。

请注意,Apache Commons 有很多有用的与字符串相关的东西,包括 join() 方法。

【讨论】:

  • 谢谢,我真的不明白后向应该如何与替换部分($&)一起工作......
  • 我已经删除了对lookbehinds的引用,因为上述方法更简单/不易出错等。
【解决方案2】:

您也可以编写一个简单的方法来执行此操作。它更复杂但更优化:

public static String toCamelCase(String value) {
    value = value.toLowerCase();
    byte[] source = value.getBytes();
    int maxLen = source.length;
    byte[] target = new byte[maxLen];
    int targetIndex = 0;

    for (int sourceIndex = 0; sourceIndex < maxLen; sourceIndex++) {
        byte c = source[sourceIndex];
        if (c == '_') {
            if (sourceIndex < maxLen - 1)
                source[sourceIndex + 1] = (byte) Character.toUpperCase(source[sourceIndex + 1]);
            continue;
        }

        target[targetIndex++] = source[sourceIndex];
    }

    return new String(target, 0, targetIndex);
}

我喜欢 Apache 公用库,但有时了解它的工作原理并能够为此类工作编写一些特定代码是件好事。

【讨论】:

  • @immerhart 仅当默认编码为每个字符单字节时才有效,例如 ASCII、ISO-8859-1 或类似。任何 Unicode 编码都失败。但最重要的是,绝对没有理由这样设计,正确的解决方案将使用相同数量的代码。
  • @immerhart 如果您认为自己需要,可以轻松修复此解决方案。
  • 如何?而不是使用 byte[], char[]?
  • 糟糕,我的错。你是对的,我认为他只需要单字节字符。此外,使用 toCharArray 确实要好得多。
  • 你甚至不需要toCharArray();只需使用 charAt() 遍历原始字符串并使用 StringBuilder 创建新字符串。
【解决方案3】:

问题是Java.util.regex.Pattern不支持从小写到大写的转换 这意味着您需要按照 Brian 的建议以编程方式进行转换。另见this thread

【讨论】:

  • 为什么是这个:"(?
  • 请再次注意正则表达式可能不是您要查找的内容。但仅供参考,_\w 匹配下划线和后面的字母字符,而 (?&lt;=_)(\w) 仅匹配字母字符。
  • 是的,_\w 使用下划线,但那又怎样?无论如何,您并没有保留它,而是在捕获这封信。即使您可以为此使用正则表达式,向后看也无关紧要。 (您知道,\w 匹配下划线和数字以及字母。)
  • 著名的艾伦,特别是因为替换删除了这里需要的下划线。
猜你喜欢
  • 1970-01-01
  • 2021-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多