web-dev-qa-db-ja.com

Googleスプレッドシートの数式での複数の正規表現の一致

Googleスプレッドシートの正規表現の数式を使用して、指定した文字列(セルA1で例を示します)でハイフンの前にあるすべての数字のリストを取得しようとしています。

=REGEXEXTRACT(A1, "\d-")

私の問題は、最初の一致のみを返すということです...どうすればすべての一致を取得できますか

テキストの例:

"A1-Nutrition;A2-ActPhysiq;A2-BioMeta;A2-Patho-jour;A2-StgMrktg2;H2-Bioth2/EtudeCas;H2-Bioth2/Gemmo;H2-Bioth2/Oligo;H2-Bioth2/Opo;H2-Bioth2/Organo;H3-Endocrino;H3-Génétiq"

私の数式は1-を返しますが、1-2-2-2-2-2-2-2-2-2-3-3-を(配列または連結テキストとして)取得したいのですが。

スクリプトまたは別の関数(SPLITなど)を使用して目的の結果を達成できることは知っていますが、本当に知りたいのは、re_正規表現を使用して、このような複数の一致を "REGEX.* "Googleスプレッドシートの数式。 「gのような何か-最初に戻ってはいけない regex101.com のmatch "オプション

また、REGEXREPLACEを使用して不要なテキストを削除しようとしましたが、成功しませんでした(ハイフンの前にない他の数字を取り除くことができませんでした)。

助けてくれてありがとう!ありがとう:)

8
flo5783

編集する

私はより一般的な解決策を思いつきました:

=regexreplace(A1,"(.)?(\d-)|(.)","$2")


この式を試してください:

=regexreplace(regexreplace(A1,"[^\-0-9]",""),"(\d-)|(.)","$1")

次のように文字列を処理します。

"A1-Nutrition;A2-ActPhysiq;A2-BioM---eta;A2-PH3-Généti***566*9q"

出力あり:

1-2-2-2-3-

2
Max Makhrov

テキストを置き換える代わりに、正規表現を使用してすべての値をキャプチャグループで囲む単一の数式でこれを実際に行うことができます。

=join("",REGEXEXTRACT(A1,REGEXREPLACE(A1,"(\d-)","($1)")))

基本的には、\d-のすべてのインスタンスを「キャプチャグループ」で囲み、正規表現抽出を使用して、すべてのキャプチャをきちんと返します。それを単一の文字列に結合したい場合は、joinを使用して単一のセルに戻すことができます。

enter image description here

6

これは動作するようで、私はそれを確認しようとしました。

ロジックは

(1)ハイフンが続く文字を何も置換しない

(2)ハイフンが続かない数字を何もないものに置き換える

(3)数字でもハイフンでもないものは何もないものに置き換える

=regexreplace(A1,"[a-zA-Z]-|[0-9][^-]|[a-zA-Z;/é]","")

結果

1-2-2-2-2-2-2-2-2-2-3-3-

分析

これが正しいことを自分に納得させるために、私はこれらを手続き的に踏まなければなりませんでした。 このリファレンス によると、パイプ記号で区切られた代替がある場合、正規表現は左から右の順にそれらと一致する必要があります。上記の式は、ルール1が最初にない限り正しく機能しません(そうでない場合、ルール(1)が機能し、「Patho-jour」から追加のハイフンを取得する前に、数字またはハイフンを除くすべての文字がnullに削減されます)。

これは、テキストを処理する方法の例です。

enter image description here

2
Tom Sharpe

私のケースでは、受け入れられた回答を得ることができませんでした。そのようにしたいのですが、簡単な解決策が必要で、次のようにしました:

入力:

1111 days, 123 hours 1234 minutes and 121 seconds

予想される出力:

1111 123 1234 121

式:

=split(REGEXREPLACE(C26,"[a-z,]"," ")," ")
2