Groovyのストリングのタイプ

  • link:/category/programming/ [プログラミング]

  • Groovy

1. 概要

このチュートリアルでは、シングルクォート、ダブルクォート、トリプルクォート、スラッシュなど、https://www.baeldung.com/groovy-language [Groovy]の文字列のいくつかのタイプを詳しく見ていきます。文字列。
また、Groovyの特殊文字、複数行、正規表現、エスケープ、変数補間の文字列サポートについても説明します。

2. 強化_java.lang.String_

GroovyはJavaに基づいているため、連結、String API、およびそのためのString定数プールの固有の利点など、Javaのすべての__String ___capabilitiesを備えていると述べることから始めるのがおそらく良いでしょう。
まず、Groovyがこれらの基本の一部をどのように拡張するかを見てみましょう。

2.1. 文字列連結

文字列の連結は、2つの文字列の単なる組み合わせです。
def first = 'first'
def second = "second"
def concatenation = first + second
assertEquals('firstsecond', concatenation)
Groovyがこれに基づいて構築しているのは、他のいくつかの文字列タイプです。これについては後で説明します。 *各タイプを交換可能に連結できることに注意してください。*

2.2. 文字列補間

現在、Javaは_printf_を介していくつかの非常に基本的なテンプレートを提供していますが、Groovyはさらに深くなり、* __ string補間、__変数を使用して文字列をテンプレート化するプロセスを提供しています*:
def name = "Kacper"
def result = "Hello ${name}!"
assertEquals("Hello Kacper!", result.toString())
Groovyはすべての文字列タイプの連結をサポートしますが、*特定のタイプの補間のみを提供します*。

2.3. GString

しかし、この例では少ししわが隠されています-*なぜ_toString()_を呼び出すのですか?*
実際、__result __は、たとえ似ていても、_String_型ではありません。
__String __classは_final_であるため、補間をサポートするGroovyの文字列クラス_GString_はサブクラス化されません。 つまり、Groovyがこの拡張機能を提供するために、* Growovには独自の文字列クラス_GString_があり、_String ._ *から拡張することはできません。
簡単に言えば、私たちがやった場合:
assertEquals("Hello Kacper!", result)
これにより__assertEquals(Object、Object)が呼び出され、__andが取得されます。
java.lang.AssertionError: expected: java.lang.String<Hello Kacper!>
  but was: org.codehaus.groovy.runtime.GStringImpl<Hello Kacper!>
Expected :java.lang.String<Hello Kacper!>
Actual   :org.codehaus.groovy.runtime.GStringImpl<Hello Kacper!>

3. 単一引用符付き文字列

*おそらく、Groovyで最も単純な文字列は、一重引用符付きの文字列です*
def example = 'Hello world'
内部では、これらは単純に古いplainJava _Strings_であり、文字列内に引用符が必要な場合に便利です。
の代わりに:
def hardToRead = "Kacper loves \"Lord of the Rings\""
ある文字列と別の文字列を簡単に連結できます。
def easyToRead = 'Kacper loves "Lord of the Rings"'
このように引用タイプを交換できるため、引用をエスケープする必要が減ります。

4. トリプルシングルクォートストリング

*トリプルシングルクォート文字列は、複数行のコンテンツを定義するコンテキストで役立ちます。*
たとえば、文字列として表す_JSON_があるとします。
{
    "name": "John",
    "age": 20,
    "birthDate": null
}
*これを表すために連結と明示的な改行文字に頼る必要はありません。*
代わりに、三重引用符で囲まれた文字列を使用しましょう。
def jsonContent = '''
{
    "name": "John",
    "age": 20,
    "birthDate": null
}
'''
  • Groovyはこれを単純なJava String **として保存し、必要な連結と改行を追加します。

    ただし、まだ克服すべき課題が1つあります。
    *通常、コードを読みやすくするために、コードをインデントします:*
def triple = '''
    firstline
    secondline
'''
しかし、*トリプルシングルクォート文字列は空白を保持します*。 つまり、上記の文字列は実際には次のとおりです。
(newline)
    firstline(newline)
    secondline(newline)
not:

1

2
a

firstline(newline)

secondline(newline)

おそらく我々が意図したように。
どのようにそれらを取り除くかをお楽しみに。

4.1. 改行文字

*以前の文字列が改行文字*で始まることを確認しましょう:
assertTrue(triple.startsWith("\n"))
そのキャラクターを取り除くことは可能です。 *これを防ぐには、最初と最後の文字として単一のバックスラッシュ_ \ _ *を使用する必要があります。
def triple = '''\
    firstline
    secondline
'''
現在、少なくとも次のものがあります。

1

2
a

firstline(newline)

secondline(newline)

1つ問題があり、もう1つ問題があります。

4.2. コードのインデントを取り除く

次に、インデントに注意しましょう。 *書式設定は維持したいが、不要な空白文字は削除する。*
Groovy String APIが助けになります!
*文字列のすべての行の先頭のスペースを削除するには、Groovyのデフォルトメソッドの1つである_String#stripIndent()_:*を使用できます。
def triple = '''\
    firstline
    secondline'''.stripIndent()
assertEquals("firstline\nsecondline", triple)
目盛りを1行上に移動することで、末尾の改行文字も削除したことに注意してください。 *

4.3。 相対インデント

__stripIndent __は_stripWhitespace._と呼ばれないことを覚えておく必要があります。
  • _stripIndent_は、文字列内の短縮された非空白行からのインデントの量を決定します。*

    それで、_triple_変数のインデントをかなり変更しましょう:
class TripleSingleQuotedString {

    @Test
    void 'triple single quoted with multiline string with last line with only whitespaces'() {
        def triple = '''\
            firstline
                secondline\
        '''.stripIndent()

        // ... use triple
    }
}
_triple_を印刷すると、次のように表示されます。
firstline
    secondline
  • firstline は最小インデントの非空白行であるため、zero_secondline_はそれに対して相対的にインデントされた状態でゼロインデントになります。*

    また、今回は、先ほど見たように、末尾の空白をスラッシュで削除します。

4.4. _stripMargin()_でストリップ

*さらに制御するために、|を使用して行の開始位置をGroovyに正しく伝えることができます。および_stripMargin _:*
def triple = '''\
    |firstline
    |secondline'''.stripMargin()
表示されるもの:
firstline
secondline
*パイプは、文字列のその行が実際に始まる場所を示します。*
また、_Character_または_CharSequence_を、カスタム区切り文字で__stripMargin __の引数として渡すことができます。
素晴らしい、不要な空白をすべて取り除いて、文字列には必要なものだけが含まれています!

4.5. 特殊文字のエスケープ

*トリプルシングルクォート文字列のすべての利点により、文字列の一部であるシングルクォートとバックスラッシュをエスケープする必要があるという自然な結果が生じます。 *
特殊文字を表すには、バックスラッシュでエスケープする必要もあります。 最も一般的な特殊文字は、改行(_ \ n_)と集計(_ \ t_)です。
例えば:
def specialCharacters = '''hello \'John\'. This is backslash - \\ \nSecond line starts here'''
次のようになります。
hello 'John'. This is backslash - \
Second line starts here
覚えておく必要のあるものがいくつかあります。
  • _ \ t _–集計

  • _ \ n_ –改行

  • _ \ b_ –バックスペース

  • _ \ r_ –復帰

  • _ \\ _ –バックスラッシュ

  • _ \ f_ –フォームフィード

  • _ \ ‘_ –単一引用符

5. 二重引用符付き文字列

二重引用符で囲まれた文字列もJava _Strings_にすぎませんが、その特別な力は補間です。 二重引用符で囲まれた文字列に補間文字が含まれている場合、Groovyは_GString_のJava _String_を切り替えます。

* 5.1。* _GString_および遅延評価

*式を_ $ \ {} _またはドット式の場合は_ $ _で囲むことにより、二重引用符で囲まれた文字列を補間できます。*
*その評価は怠**ですが、-_String_を必要とするメソッドに渡されるまで_String_に変換されません:
def string = "example"
def stringWithExpression = "example${2}"
assertTrue(string instanceof String)
assertTrue(stringWithExpression instanceof GString)
assertTrue(stringWithExpression.toString() instanceof String)

5.2. 変数を参照するプレースホルダー

おそらく補間で最初にしたいことは、変数参照を送信することです。
def name = "John"
def helloName = "Hello $name!"
assertEquals("Hello John!", helloName.toString())

5.2. 式を持つプレースホルダー

しかし、式を与えることもできます:
def result = "result is ${2 * 2}"
assertEquals("result is 4", result.toString())
*文をプレースホルダーに入れることもできますが、それは悪い習慣と見なされます。*

5.3. ドット演算子を使用したプレースホルダー

文字列内のオブジェクト階層を歩くこともできます。
def person = [name: 'John']
def myNameIs = "I'm $person.name, and you?"
assertEquals("I'm John, and you?", myNameIs.toString())
*ゲッターを使用すると、Groovyは通常プロパティ名を推測できます。*
**しかし、メソッドを直接呼び出す場合、_ $ \ {} _ ** __ __を使用する必要があります。
def name = 'John'
def result = "Uppercase name: ${name.toUpperCase()}".toString()
assertEquals("Uppercase name: JOHN", result)

5.4. _String_および_String_のhashCode

単純な__java.util.String、___butと比較して、補間された文字列は確かに天の恵みです。しかし、それらは重要な点で異なります。*
Java _Strings_は不変であるため、指定された文字列で_hashCode_を呼び出すと、常に同じ値が返されます。
しかし、** _ GString_ハッシュコードは、__ String __representationが補間された値に依存するため、変化する可能性があります。
*そして実際には、同じ結果の文字列であっても、それらは同じハッシュコードを持ちません:*
def string = "2+2 is 4"
def gstring = "2+2 is ${4}"
assertTrue(string.hashCode() != gstring.hashCode())
*したがって、_Map_のキーとして_GString_を使用しないでください!*

6. トリプルダブルクォート文字列

そのため、トリプルシングルクォート文字列とダブルクォート文字列を見ました。
*両方の長所を組み合わせて、両方の長所を活用しましょう。複数行の文字列補間:*
def name = "John"
def multiLine = """
    I'm $name.
    "This is quotation from 'War and Peace'"
"""
また、一重引用符または二重引用符をエスケープする必要がないことに注意してください*!

7. スラッシュストリング

ここで、正規表現を使用して何かをしているとしましょう。したがって、バックスラッシュをあちこちでエスケープしています。
def pattern = "\\d{1,3}\\s\\w+\\s\\w+\\\\\\w+"
それは明らかに混乱です。
これを支援するために、* Groovyはスラッシュ文字列を介してネイティブに正規表現をサポートします:*
def pattern = /\d{3}\s\w+\s\w+\\\w+/
assertTrue("3 Blind Mice\Men".matches(pattern))
スラッシュ文字列*補間と複数行の両方が可能*:
def name = 'John'
def example = /
    Dear ([A-Z]+),
    Love, $name
/
もちろん、スラッシュをエスケープする必要があります。
def pattern = /.*foobar.*\/hello.*/
**コンパイラは_ // _をコメントとして理解するため、_Slashy String_ **で空の文字列を表すことはできません。
// if ('' == //) {
//     println("I can't compile")
// }

8. ドルスラッシュ文字列

スラッシュ文字列は素晴らしいですが、スラッシュをエスケープしなければならないのは残念です。 *スラッシュの追加のエスケープを回避するために、ドルスラッシュ文字列を使用できます。 *
_ [0-3] + / [0-3] + _という正規表現パターンがあると仮定しましょう。 スラッシュ文字列に適しているのは、スラッシュ文字列であるため、_ [0-3] + // [0-3] + _と記述する必要があります。
ドルスラッシュ*文字列は複数行/ __ GString__sで、$ /で開き、/ $で閉じます。*ドルまたはスラッシュをエスケープするには、ドル記号($)を前に付けることができますが、必須ではありません。
_GString_プレースホルダーで$をエスケープする必要はありません。
例えば:
def name = "John"

def dollarSlashy = $/
    Hello $name!,

    I can show you a $ sign or an escaped dollar sign: $$
    Both slashes work: \ or /, but we can still escape it: $/

    We have to escape opening and closing delimiters:
    - $$$/
    - $/$$
 /$
出力されます:
Hello John!,

I can show you a $ sign or an escaped dollar sign: $
Both slashes work: \ or /, but we can still escape it: /

We have to escape opening and closing delimiter:
- $/
- /$

9. キャラクター

Javaに精通している人は、Groovyが文字列に一重引用符を使用しているため、Groovyが文字で何をしたかについてすでに疑問に思っています。
実際、Groovyには明示的な文字リテラルはありません。*
_Groovy_ stringを実際の文字にする* 3つの方法*があります。
  • 変数を宣言する際の「char」キーワードの明示的な使用

  • 「as」演算子を使用する

  • 「char」にキャストする

    それらすべてを見てみましょう。
char a = 'A'
char b = 'B' as char
char c = (char) 'C'
assertTrue(a instanceof Character)
assertTrue(b instanceof Character)
assertTrue(c instanceof Character)
最初の方法は、文字を変数として保持する場合に非常に便利です。 他の2つのメソッドは、関数への引数として文字を渡したい場合により興味深いものになります。

10. 概要

明らかに、それはたくさんありましたので、いくつかの重要なポイントを簡単に要約しましょう。
  • 単一引用符( ’)で作成された文字列は補間をサポートしていません

  • スラッシュと三重の二重引用符文字列は複数行にできます

  • 複数行の文字列にはコードによる空白文字が含まれています
    くぼみ

  • バックスラッシュ(\)は、すべてのタイプの特殊文字をエスケープするために使用されます。
    エスケープするためにドル($)を使用する必要があるドルスラッシュ文字列を除く

11. 結論

この記事では、Groovyでストリングを作成するさまざまな方法と、複数行、補間、および正規表現のサポートについて説明しました。
これらのスニペットはすべて利用可能ですhttps://github.com/eugenp/tutorials/tree/master/core-groovy[Githubで]。
また、Groovy言語自体の機能の詳細については、https://www.baeldung.com/groovy-language [Groovyの紹介]から始めてください。