決して戻らない正規表現を書くことが可能だとは思ってもみませんでした。
正規表現
/^((?:\d|\w{1,2}[-\d\s])(?:[-\s\d]|\w{1,2}[-\d\s])*\d)$/
1桁または2文字で始まり、その後にダッシュ、空白または数字が続き、数字で終わる数字に一致するように構築されました。開始パターンの間に繰り返されるか、空白またはダッシュが発生する可能性があります。
例:1234、de-12943、EN-12de -50
次のサンプルコードは終了しません。
ルビー
#!/usr/bin/ruby
string = "101000000750000000000000000000000001000038127OXMOO0OOOOO00000000000N9"
re = /^((?:\d|\w{1,2}[-\d\s])(?:[-\s\d]|\w{1,2}[-\d\s])*\d)$/
p re.match("101000000750000000000000000000000001000038127OXMOO0OOOOO00000000000N9")
スカラ
"""^((?:\d|\w{1,2}[-\d\s])(?:[-\s\d]|\w{1,2}[-\d\s])*\d)$""".r findFirstIn "101000000750000000000000000000000001000038127OXMOO0OOOOO00000000000N9"
アンカー(^、$)を削除すると、正規表現をすばやく終了できます。
RubyとScalaで試してみました。
そこで何が起こっているのですか?アンカーはより速い終了につながるべきではありませんか?