99

代わりにのようFooBarな文字列を正規表現を使用して変換した場合に、目的の出力が得られない理由を理解しています。私は String.substring で何かをしたり、最後の文字を置き換えたりすることができましたが、そのようなシナリオにはもっと良い解決策があると思います.Foo_BarFoo_Bar_substring(0, string.length() - 2)

コードは次のとおりです。

String regex = "([A-Z][a-z]+)";
String replacement = "$1_";

"CamelCaseToSomethingElse".replaceAll(regex, replacement); 

/*
outputs: Camel_Case_To_Something_Else_
desired output: Camel_Case_To_Something_Else
*/

質問: 目的の出力を得るためのより適切な方法をお探しですか?

4

13 に答える 13

189

この質問を見てCaseFormat、グアバから

あなたの場合、次のようなものです:

CaseFormat.UPPER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, "SomeInput");
于 2012-04-25T06:23:58.927 に答える
71

小文字と大文字を2つのグループとしてバインドします。問題ありません。

public  class Main
{
    public static void main(String args[])
    {
        String regex = "([a-z])([A-Z]+)";
        String replacement = "$1_$2";
        System.out.println("CamelCaseToSomethingElse"
                           .replaceAll(regex, replacement)
                           .toLowerCase());
    }
}
于 2012-04-25T06:44:18.063 に答える
43

以下のコード スニペットを使用できます。

String replaceAll = key.replaceAll("(.)(\\p{Upper})", "$1_$2").toLowerCase();
于 2013-08-12T18:54:26.220 に答える
7

RegEx を提供することはできません。いずれにしても非常に複雑です。

頭字語の自動認識でこの機能を試してください。

残念ながら、Guava lib は大文字の頭字語を自動検出しないため、「bigCAT」は「BIG_C_A_T」に変換されます。

/**
 * Convert to UPPER_UNDERSCORE format detecting upper case acronyms
 */
private String upperUnderscoreWithAcronyms(String name) {
    StringBuffer result = new StringBuffer();
    boolean begin = true;
    boolean lastUppercase = false;
    for( int i=0; i < name.length(); i++ ) {
        char ch = name.charAt(i);
        if( Character.isUpperCase(ch) ) {
            // is start?
            if( begin ) {
                result.append(ch);
            } else {
                if( lastUppercase ) {
                    // test if end of acronym
                    if( i+1<name.length() ) {
                        char next = name.charAt(i+1);
                        if( Character.isUpperCase(next) ) {
                            // acronym continues
                            result.append(ch);
                        } else {
                            // end of acronym
                            result.append('_').append(ch);
                        }
                    } else {
                        // acronym continues
                        result.append(ch);
                    }
                } else {
                    // last was lowercase, insert _
                    result.append('_').append(ch);
                }
            }
            lastUppercase=true;
        } else {
            result.append(Character.toUpperCase(ch));
            lastUppercase=false;
        }
        begin=false;
    }
    return result.toString();
}
于 2018-06-13T12:56:51.237 に答える
3

幅ゼロの先読みアサーションを追加します。

http://docs.oracle.com/javase/6/docs/api/java/util/regex/Pattern.html

(?=X)などのドキュメントを読んでください。

個人的には、実際に文字列を分割してから再結合します。これは、正しく行うとさらに高速になる可能性があり、コードは正規表現の魔法よりもはるかに理解しやすくなります。誤解しないでほしいのですが、私は正規表現が大好きです。しかし、これは実際にはきちんとした正規表現ではなく、この変換は古典的な正規表現のタスクでもありません。結局、あなたも小文字をやりたいようですか?

醜いが簡単なハックは、文字列全体を置き換え(.)([A-Z]+)$1_$2から、後で文字列全体を小文字にすることです (ただし、perl スタイルの拡張正規表現を使用して、置換を直接小文字にすることができます!)。それでも、これを行う適切で最も読みやすい方法として、下位から上位への遷移で分割し、次に変換してから結合すると考えています。

于 2012-04-25T06:21:03.217 に答える
2
public class ReplaceFromCameltoSnake {
    public static void main(String args[]){
        String s1=" totalAmountWithoutDiscount";  
        String replaceString=s1.replaceAll("([A-Z]+)","\\_$1").toLowerCase(); 
        System.out.println(replaceString);  
    }
}
于 2016-08-21T17:07:18.913 に答える
1
([A-Z][a-z\d]+)(?=([A-Z][a-z\d]+))

大文字の後に小文字が続くものを検索する必要があります。肯定先読みは、大文字で始まり、その後に小文字が続く別の単語を探しますが、一致には含めません。

ここを見てください:http://regexr.com?30ooo

于 2012-04-25T06:29:40.897 に答える
0

キャメルケース形式のいくつかのキーをアンダースコア付きの小文字に変換するために、これを実装する必要がありました。私が思いついた正規表現は次のとおりです。

(?<!^|_|[A-Z])([A-Z])

英語では、文字列の先頭、アンダースコア、または別の大文字が先行していない大文字を表します。

以下のサンプルで、太字の文字は、前述の正規表現を使用して一致を生成する必要がある文字です。

  • キャメルケースTo o Something Else _ _ _
  • camel Case To o Something Else _ _ _
  • camel_case_to_something_else
  • Camel_Case_To_Something_Else
  • CAMEL_CASE_TO_SOMETHING_ELSE

この式は、すでに小文字 + アンダースコアの形式になっている文字列には影響しないことに注意してください。

置換パターンは次のようになります。

_l$1

これは、最初のキャプチャ グループが小文字で、最初のキャプチャ グループが大文字であることを意味します。上記のリストの最後の 2 つのサンプルを正規化するために、後で文字列全体を小文字にすることもできます。

于 2018-09-06T02:38:38.690 に答える