flutter - 2 つの異なる正規表現を 1 つで機能させるにはどうすればよいですか?

okwaves2024-01-25  11

特定のキーの日付と一致するように検索しましたが、現在、すべての日付と一致するか、特定のキーと一致しますが、日付を分けて一致することはできません。

より視覚的な説明は次のとおりです

私が持っている入力

Mystring ="
Text("List1:[2000-00-00 00:00, 2020-09-02 04:30, 2020-09-03 00:30, 2020-09-03 02:30, 2020-09-03 04:30, 2020-09-03 07:25, 2020-09-03 10:00, 2020-09-03 10:02],
Text("List2:[2000-00-00 00:00, 2020-09-02 04:30, 2020-09-03 00:30, 2020-09-03 02:30, 2020-09-03 04:30, 2020-09-03 07:25, 2020-09-03 10:00, 2020-09-03 10:02]
"

この関数を使用すると、Mystring のすべての日付が一致します

 RegExp regExp79 = new RegExp(r'\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}');
 mylistdate = regExp79.allMatches(Mystring).map((z) => z.group(0));
 print(mylistdate);

ただし、出力にはすべての日付が含まれます (list1 と List2) list1 のみと一致させようとします

そこで、文字数制限を設けてみました。たとえば、list1 の日付のみが必要な場合は、Text("List1:[. and ]

と一致させようとしました。

これらの正規表現はすべて個別に動作しますが、連携して動作させる方法が見つかりません

Text\("list1:\[    => start limitation
    
(\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}) => extraction of date 

(.*?)] => end of limitation 

しかし、すべてを溶かしても機能しません。最初の日付のみが選択されるため、限られた選択範囲のすべての日付と一致します。

Text\("List1:\[(\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}).*?]    

https://regex101.com/r/6adb1u/1

1

Flutter 正規表現はまだ無限長の後読みパターンをサポートしていませんね。存在する場合は、/(?<=Text\("List1:\[[^\][]*?)\d{4}-\d{2}-」のような JS 正規表現を使用できます。 \d{2}\s\d{2}:\d{2}(?=[^\][]*])/ (デモ)

– Wiktor Stribiżew

2020 年 9 月 3 日 10:32

ありがとうございます!!あなたはその男です!

– ニットヌク

2020 年 9 月 3 日 10:40



------------------------

使用できます

(?<=Text\("List1:\[[^\][]*?)\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}(?=[^\][]*])

正規表現のデモをご覧ください

詳細 (?<=Text\("List1:\[[^\][]*?) - Text("List1:[ と角括弧以外の 0 個以上の文字 (可能な限り少ない) を必要とする肯定的な後読みできるだけ)現在の場所のすぐ左側 \d{4}-\d{2}-\d{2}\s\d{2}:\d{2} - 4 桁、-、2 桁、-、2 桁、空白、2 桁、 : と 2 桁 (?=[^\][]*]) - w の後に角括弧以外の 0 個以上の文字 (できるだけ多く) を必要とする正の先読み現在の場所のすぐ右にある ] 文字です。

コード例:

String Mystring ="\nText(\"List1:[2000-00-00 00:00, 2020-09-02 04:30, 2020-09-03 00:30, 2020-09-03 02:30, 2020-09-03 04:30, 2020-09-03 07:25, 2020-09-03 10:00, 2020-09-03 10:02],\nText(\"List2:[2000-00-00 00:00, 2020-09-02 04:30, 2020-09-03 00:30, 2020-09-03 02:30, 2020-09-03 04:30, 2020-09-03 07:25, 2020-09-03 10:00, 2020-09-03 10:02]";
RegExp regExp79 = new RegExp(r'(?<=Text\("List1:\[[^\][]*?)\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}(?=[^\][]*])');
print(regExp79.allMatches(Mystring).map((z) => z.group(0)).toList());

出力:

[2000-00-00 00:00, 2020-09-02 04:30, 2020-09-03 00:30, 2020-09-03 02:30, 2020-09-03 04:30, 2020-09-03 07:25, 2020-09-03 10:00, 2020-09-03 10:02]

4

ちょっとした質問ですが、出力に日付 (5 つ以上) がある場合 (2000-00-00 00:00、2020-09-02 04:30、2020-09-03 00:30、.. .、2020-09-03 10:00、2020-09-03 10:02)

– ニットヌク

2020 年 9 月 3 日 11:14

なぜ 、... があるのか​​わかりません。

– ニットヌク

2020 年 9 月 3 日 11:14

これは単なる表示の問題であり、リストには実際にはすべての項目が含まれています。 for (Match m in regExp79.allMatches(Mystring)) { print(m.group(0)); で簡単に確認できます。 }

– Wiktor Stribiżew

2020 年 9 月 3 日 11:16

奇妙です。すべてのデータがコードとともに適切にリストされていますが、出力を印刷すると、... が表示されます。そして、... のせいで、prefs.setStringList が機能せず、返されません。ヌル。ただし、この形式で手動で追加すると、 mylistdate = ['2000-00-00 00:00','2020-09-02 04:30', '2020-09 -03 00:30' ];仕事です

– ニットヌク

2020 年 9 月 3 日 11:37

総合生活情報サイト - OKWAVES
総合生活情報サイト - OKWAVES
生活総合情報サイトokwaves(オールアバウト)。その道のプロ(専門家)が、日常生活をより豊かに快適にするノウハウから業界の最新動向、読み物コラムまで、多彩なコンテンツを発信。