私はこのような文字列の太字部分をキャプチャしようとしています:
'文字列の終わりに年の範囲をキャプチャする1995-2010 '
「年の範囲がない場合は、 2005年の1年をキャプチャするだけです」
' 2007-2012(58か月)の括弧を含む括弧が後に続く年/年の範囲をキャプチャします'
この正規表現は1と2で機能しますが、3では機能しません。
/(\d+([-–— ]\d+( \(\d+ months\))?)?$)/
私は何が間違っているのですか?
私はこのような文字列の太字部分をキャプチャしようとしています:
'文字列の終わりに年の範囲をキャプチャする1995-2010 '
「年の範囲がない場合は、 2005年の1年をキャプチャするだけです」
' 2007-2012(58か月)の括弧を含む括弧が後に続く年/年の範囲をキャプチャします'
この正規表現は1と2で機能しますが、3では機能しません。
/(\d+([-–— ]\d+( \(\d+ months\))?)?$)/
私は何が間違っているのですか?
この正規表現はうまく機能します。:)
/(?:(?:\d{4}[-–— ])?\d{4})(?: \(\d+ months\))?$/
私の正規表現とJonahの主な違いは、私の正規表現に?:
はサブグループをキャプチャしないことを意味するが含まれていることです。replace
正規表現でグループ化すると、指示しない限り、そのグループに含まれるものが自動的に返されます。またはなどのメソッドを使用しているときにこれらのグループがキャプチャさsplit
れると、少しバグが発生する可能性があることがわかりました。あなたの問題も。
この正規表現を試してください:
/\d{4}(?:[-–— ]\d{4})?(?:\s*\([^)]+\))?$/gm
これは括弧内のすべてをキャプチャします。括弧内の「(number)months」というテキストに固有の正規表現が必要な場合は、次を使用できます。\d{4}(?:[-–— ]\d{4})?(?:\s+\(\d+\smonths\))?$
サンプルテキスト:
そしてJavaScriptコード:
var regex = /\d{4}(?:[-–— ]\d{4})?(?:\s*\([^)]+\))?$/gm; //multiline enabled
var input = "your input string";
if(regex.test(input)) {
var matches = input.match(regex);
for(var match in matches) {
alert(matches[match]);
}
} else {
alert("No matches found!");
}
次の正規表現は、サンプルのPerlスクリプトで機能します。JavaScriptで動作するはずです:
/(\d{4}([-–— ]\d{4})?( \(\d+ months\))?)$/
\d{4}
([-–— ]\d{4})?
( \(\d+ months\))?
\s*
データが常にこの厳密なテンプレートに準拠しているとは限らない場合は、必要に応じて空白の一致()を挿入する必要があります。
私があなたのニーズを正しく理解していれば、実際にはここでうまく機能します:Gskinner RegExr $は改行にはカウントされず、文字列の終わりだけなので、最後の文を交互に使用します。