guidと、名前、タイプ、バージョンなどの他のいくつかの属性を抽出するこの正規表現があります。最適化と改善については、正規表現を確認してください。
文字列は常に
/publication/guid/type/name;version=1234
regex
テストレコード
文字列から太字の部分を抽出します。
/publication/d40a4e4c-d6a3-45ae-98b3-924b31d8712a/collection/content1;version=1520623346833
期待される出力:
- d40a4e4c-d6a3-45ae-98b3-924b31d8712a
- コレクション
- content1
- 1520623346833
/publication/d40a4e4c-d6a3-45ae-98b3-924b31d8712a/article/testContent;version=1520623346891
期待される出力
- d40a4e4c-d6a3-45ae-98b3 -924b31d8712a
- 記事
- testContent
- 1520623346891
コード
言語はF#ですが、正規表現はC#でも機能します。さらに、Node.jsで同じ正規表現を使用したいので、正規表現を言語に依存しないようにします。
let matchEntity (m: Match) = { id= m.Groups.[1].Value; eType = m.Groups.[3].Value; name= m.Groups.[4].Value; version = m.Groups.[5].Value} let regex = new Regex("(([a-f0-9]+\-)+[a-f0-9]+)\/(.*?)\/(.*?);version=(\d*)") matchEntity regex.Match "/publication/d40a4e4c-d6a3-45ae-98b3-924b31d8712a/collection/content1;version=1520623346833"
コメント
- 追加されたコード、言語はc#、f#ですが、言語に依存しない必要があります。私もnodejsで使用します。正規表現は汎用である必要があり、特定の言語の実装は必要ありません。
- 必要ありません' regexrでは機能しません
- 機能します。 i.stack.imgur.com/gyZnT.png
回答
TL; DR;調整のリスト:
- .NETRegExは名前付きキャプチャグループをサポートします。それらを利用してください。
- GUID形式の仕様を利用してください。
- 非キャプチャグループを使用して取得を簡素化します。
- 文字クラスで仮定を明示的にします。貪欲でないマッチングよりも否定された文字グループを優先する
代わりに、正規表現に従うを提案します:
(?<guid>[a-f0-9]{8}(?:\-[a-f0-9]{4}){3}\-[a-f0-9]{12})\/(?<type>[^\/]+)\/(?<name>[^;]+);version=(?<version>\d*)
この正規表現はやや長いですが、62ステップで両方の例に一致します(117ではありません)。これは小さな改善のように見えるかもしれませんが、すべてが起こるわけではありません。
この正規表現は、はるかに自然で明確なパターン抽出を可能にする名前付きキャプチャグループを使用します。マジックインデックスでグループにアクセスする代わりに、名前でアクセスでき、matchEntity
の構築は次のように実行されます。
let matchEntity (m: Match) = { id= m.Groups.["guid"].Value; eType = m.Groups.["type"].Value; name= m.Groups.["name"].Value; version = m.Groups.["version"].Value }
最後になりましたが重要ですこの正規表現は、誤ったGUID仕様と一致しません
コメント
- +1、最近、JSで名前付き正規表現キャプチャグループもサポートされています。