2

私はこのような文字列の太字部分をキャプチャしようとしています:

  1. '文字列の終わりに年の範囲をキャプチャする1995-2010 '

  2. 「年の範囲がない場合は、 2005年の1年をキャプチャするだけです」

  3. ' 2007-2012(58か月)の括弧を含む括弧が後に続く年/年の範囲をキャプチャします'

この正規表現は1と2で機能しますが、3では機能しません。

/(\d+([-–— ]\d+( \(\d+ months\))?)?$)/

私は何が間違っているのですか?

4

4 に答える 4

2

この正規表現はうまく機能します。:)

/(?:(?:\d{4}[-–— ])?\d{4})(?: \(\d+ months\))?$/

私の正規表現とJonahの主な違いは、私の正規表現に?:はサブグループをキャプチャしないことを意味するが含まれていることです。replace正規表現でグループ化すると、指示しない限り、そのグループに含まれるものが自動的に返されます。またはなどのメソッドを使用しているときにこれらのグループがキャプチャさsplitれると、少しバグが発生する可能性があることがわかりました。あなたの問題も。

于 2012-09-05T16:52:29.330 に答える
2

この正規表現を試してください:

/\d{4}(?:[-–— ]\d{4})?(?:\s*\([^)]+\))?$/gm

これは括弧内のすべてをキャプチャします。括弧内の「(number)months」というテキストに固有の正規表現が必要な場合は、次を使用できます。\d{4}(?:[-–— ]\d{4})?(?:\s+\(\d+\smonths\))?$

テストへのリンク:RegexPalまたはRegExr

サンプルテキスト:

  • 文字列の終わりに年の範囲をキャプチャする1995-2010
  • 年の範囲がない場合は、2005年の1年だけをキャプチャします
  • 年/年の範囲をキャプチャし、その後に括弧を付けます(括弧2007-2012(58か月)を含む)
  • 別の例を試す1990(23週間)
  • 別の例を試す1995-2002(x日)
  • 別の例2050を試してみてください(何とか何とか)
  • 別の例を試す2050〜3000
  • 別の例を試す2050-3000
  • 別の例を試す2050〜3000

そして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!");
}
于 2012-09-05T17:17:10.143 に答える
1

次の正規表現は、サンプルのPerlスクリプトで機能します。JavaScriptで動作するはずです:

/(\d{4}([-–— ]\d{4})?( \(\d+ months\))?)$/
  1. 最初に4桁の年を照合します。\d{4}
  2. 次に、オプションの区切り文字とそれに続く4桁の年を照合します。([-–— ]\d{4})?
  3. 最後に、オプションの月の部分を一致させます。( \(\d+ months\))?

\s*データが常にこの厳密なテンプレートに準拠しているとは限らない場合は、必要に応じて空白の一致()を挿入する必要があります。

于 2012-09-05T16:53:00.477 に答える
0

私があなたのニーズを正しく理解していれば、実際にはここでうまく機能します:Gskinner RegExr $は改行にはカウントされず、文字列の終わりだけなので、最後の文を交互に使用します。

于 2012-09-05T17:10:46.830 に答える