JavaScript正規表現を使用してcsv文字列を検索し、一致を返す方法
-
05-07-2019 - |
質問
パターンに一致するセミコロンで区切られた文字列から最初のユーザー権利を抽出しようとしています。
ユーザーの権利は次の形式で保存されます。
LAA; LA_1; LA_2; LE_3;
ユーザーに権限がない場合、文字列は空です。
これまでの私の最善の解決策は、regex.replaceステートメントで次の正規表現を使用することです。
。* ?;(LA _ [^;] *)?。*
(グループの最後にある疑問符は、ユーザーが権利を持っていない場合に行全体を一致させるためのもので、空の文字列に置き換えて、ユーザーが持っていないことを知らせます。)
ただし、検索された権利が最初の位置にある場合、正しく機能しません。
LA_1; LA_2; LE_3;
正規表現を置き換える前に行の先頭にセミコロンを追加するだけで簡単に修正できますが、私の質問は、次の正規表現がそれに一致しないのはなぜですか?
。*?(?:(?:^ |;)(LA _ [^;] *))?。*
解決策を見つけるために他の多くの正規表現を試しましたが、これまでのところ成功していません。
解決
あなたの質問が正しいかどうかはわかりませんが、使用している正規表現に関しては、明確な理由もなく(少なくとも私には)複雑すぎます。次のようなものが必要な場合があります。
function getFirstRight(rights) {
var m = rights.match(/(^|;)(LA_[^;]*)/)
return m ? m[2] : "";
}
他のヒント
最初に文字列を分割できます:
function getFirstRight(rights)
{
return rights.split(";",1)[0] || "";
}
特定の質問「次の正規表現が一致しないのはなぜですか?」
.*?
最終的には次のものが続きます:
^|;
これは言っているように、開始文字またはセミコロンに到達するまで余分な文字をスキップします。ただし、何もスキップせずに後で開始することができます(複数行の文字列に改行が含まれていない限り)。
次のような機能があります:
.*?(\bLA_[^;]).*
つまり、単語の境界に続く" LA_"まで文字をスキップします。