繰り返しキャプチャグループ内のすべてのグループのグループ番号をキャプチャする方法

nantitv

私の正規表現は**(A)(([+-]\d{1,2}[YMD])*)**、A + 3M、A-3Y + 5M + 3Dなどのように期待どおりに一致するこのようなものです。

しかし、このサブパターンのすべてのグループをキャプチャしたい**([+-]\d{1,2}[YMD])***次の例A-3M + 2Dの場合、4つのグループしか表示できませんA-3M+2D (group 0), A(group 1), -3M+2D (group 2), +2D (group 3)

**-3M**別のグループとして取得する方法はありますか?

WiktorStribiżew

繰り返されるキャプチャグループは通常、最後の反復のみをキャプチャします言語には各キャプチャグループスタックを追跡するメソッドがないため、これはKotlinとJavaに当てはまります。

回避策として実行できることは、最初に文字列全体を、文字列が一致する必要がある特定のパターンに対して検証しから、文字列を抽出するか、部分に分割することです。

現在のシナリオでは、次を使用できます

val text = "A-3M+2D" 
if (text.matches("""A(?:[+-]\d{1,2}[YMD])*""".toRegex())) {
  val results =  text.split("(?=[-+])".toRegex())
  println(results)
}
// => [A, -3M, +2D]

Kotlinのデモを見る

ここに、

  • text.matches("""A(?:[+-]\d{1,2}[YMD])*""".toRegex())文字列全体が一致することを確認してAから、0個以上の+or -、1桁または2桁の後にYMまたはD
  • .split("(?=[-+])".toRegex())-またはの直前の空の文字列でテキストを分割します+

パターンの詳細

  • ^-暗黙的.matches()-文字列の開始
  • A-A部分文字列
  • (?:-非キャプチャグループの開始
    • [+-]-一致する文字クラス+または-
    • \d{1,2} -1〜2桁
    • [YMD]-文字クラスと一致するYか、MまたはD
  • )*-非キャプチャグループの終わり、0回以上繰り返します(*定量化のため
  • \z-暗黙的matches()-文字列の終わり。

分割は、私たちは前に場所を見つける必要があるとき-+、それゆえ我々は積極的に利用先読みを(?=[-+])、それはすぐに続いている位置と一致する+かを-これは消費しないパターンであり、+または-一致したものは一致値に追加されません。

単一の正規表現を使用した別のアプローチ

また、\Gベースの正規表現を使用して、文字列の先頭で最初に文字列形式をチェックし、そのチェックが成功した場合にのみ、連続する部分文字列の照合を開始することもできます。

val regex = """(?:\G(?!^)[+-]|^(?=A(?:[+-]\d{1,2}[YMD])*$))[^-+]+""".toRegex()
println(regex.findAll("A-3M+2D").map{it.value}.toList())
// => [A, -3M, +2D]

別のKotlinデモ正規表現デモを参照してください

詳細

  • (?:\G(?!^)[+-]|^(?=A(?:[+-]\d{1,2}[YMD])*$))-前回の正常な一致の終了後、+または-(を参照\G(?!^)[+-])または(|)文字列の開始の後A+/ -、1桁または2桁の出現が0回以上続いた後YMまたはD文字列の終了まで(を参照)^(?=A(?:[+-]\d{1,2}[YMD])*$)
  • [^-+]+--および以外の1つ以上の文字+先読みは弦の始めに重い物を持ち上げたので、ここではあまり注意する必要はありません。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

グループのすべての繰り返しをキャプチャする

分類Dev

正規表現:繰り返しキャプチャグループのすべての個別インスタンスをキャプチャする

分類Dev

繰り返し番号グループをキャプチャするSed

分類Dev

正規表現を使用して「複数」の繰り返しグループをキャプチャする方法

分類Dev

キャプチャグループの繰り返し

分類Dev

繰り返されるグループのキャプチャ

分類Dev

グループを繰り返しキャプチャする方法は?

分類Dev

正規表現-すべての繰り返しグループのキャプチャ

分類Dev

GOで繰り返しグループをキャプチャする

分類Dev

REGEX繰り返しグループの異なるセットをキャプチャする

分類Dev

正規表現は、キャプチャグループ以外のすべてもキャプチャします

分類Dev

繰り返しパターンですべてのグループの最初の出現をキャプチャする正規表現

分類Dev

Pythonで繰り返されるグループをキャプチャする

分類Dev

javaregex-繰り返されるグループをキャプチャする

分類Dev

正規表現-キャプチャグループの繰り返し

分類Dev

繰り返される任意のキャプチャグループ

分類Dev

繰り返される名前付きグループのキャプチャ

分類Dev

キャプチャグループの空白を説明する

分類Dev

グループをキャプチャする式の問題

分類Dev

単語の境界をキャプチャするグループ

分類Dev

キャプチャグループの空白を説明する

分類Dev

Java regex繰り返しキャプチャグループ

分類Dev

Java regex:繰り返しキャプチャグループ

分類Dev

キャプチャグループ内のすべての行にテキストを付加する

分類Dev

複雑なgolang regexpキャプチャで複数のグループをキャプチャする方法

分類Dev

Python正規表現を使用して、グループのすべての繰り返しをキャプチャします

分類Dev

繰り返しキャプチャグループは、最後の発生のみに一致します

分類Dev

(最後の発生だけではなく)すべての反復で繰り返しグループから値をキャプチャします

分類Dev

グループ内で代替キャプチャを使用するPerlRegEx非キャプチャグループ

Related 関連記事

  1. 1

    グループのすべての繰り返しをキャプチャする

  2. 2

    正規表現:繰り返しキャプチャグループのすべての個別インスタンスをキャプチャする

  3. 3

    繰り返し番号グループをキャプチャするSed

  4. 4

    正規表現を使用して「複数」の繰り返しグループをキャプチャする方法

  5. 5

    キャプチャグループの繰り返し

  6. 6

    繰り返されるグループのキャプチャ

  7. 7

    グループを繰り返しキャプチャする方法は?

  8. 8

    正規表現-すべての繰り返しグループのキャプチャ

  9. 9

    GOで繰り返しグループをキャプチャする

  10. 10

    REGEX繰り返しグループの異なるセットをキャプチャする

  11. 11

    正規表現は、キャプチャグループ以外のすべてもキャプチャします

  12. 12

    繰り返しパターンですべてのグループの最初の出現をキャプチャする正規表現

  13. 13

    Pythonで繰り返されるグループをキャプチャする

  14. 14

    javaregex-繰り返されるグループをキャプチャする

  15. 15

    正規表現-キャプチャグループの繰り返し

  16. 16

    繰り返される任意のキャプチャグループ

  17. 17

    繰り返される名前付きグループのキャプチャ

  18. 18

    キャプチャグループの空白を説明する

  19. 19

    グループをキャプチャする式の問題

  20. 20

    単語の境界をキャプチャするグループ

  21. 21

    キャプチャグループの空白を説明する

  22. 22

    Java regex繰り返しキャプチャグループ

  23. 23

    Java regex:繰り返しキャプチャグループ

  24. 24

    キャプチャグループ内のすべての行にテキストを付加する

  25. 25

    複雑なgolang regexpキャプチャで複数のグループをキャプチャする方法

  26. 26

    Python正規表現を使用して、グループのすべての繰り返しをキャプチャします

  27. 27

    繰り返しキャプチャグループは、最後の発生のみに一致します

  28. 28

    (最後の発生だけではなく)すべての反復で繰り返しグループから値をキャプチャします

  29. 29

    グループ内で代替キャプチャを使用するPerlRegEx非キャプチャグループ

ホットタグ

アーカイブ