私はこのようなものを探しています:How to generate a regular expression at runtime to match a numeric rangeが、PHPで書かれています。番号範囲に一致するPHP正規表現ジェネレータはどこにありますか?
1
A
答えて
3
コメントはコードブロックにとっては恐ろしいので、ここで質問してください。私はそのような声明を直接翻訳することはできません。それはほとんど読めません。それは次のように離れて選択する方がはるかに簡単です:
if ($n == $m) { // max/min ranges are the same, so just look for that number of characters
$format = "\{$n\}"; // {n}
} elseif ($n == 1) { // min range is 1, so use the max
$format = "\{1,$m\}"; // {1,m}
} else { // arbitary n->m range
$format = "\{$n,$m\}"; // {n,m}
}
それは三元としてPHPで行うことができ、それはしかし、デバッグが不可能/同じように判読不能です:
$format = ($n == $m) ? "\{$n\}" : (($n == 1) ? "\{1,$m\}" : "\{$n,$m\}");
0
私は、これは動作するはずだと思います。
class NumericRangeRegexGenerator {
private function baseRange($num,$up, $leading1) {
$c = $num[0];
$low = $up ? $c : ($leading1 ? '1' : '0');
$high = $up ? '9': $c;
if (strlen($num) == 1)
return $this->charClass($low, $high);
$re = $c . "(" . $this->baseRange(substr($num,1), $up, false) . ")";
if ($up) $low++; else $high--;
if ($low <= $high)
$re .= "|" . $this->charClass($low, $high) . $this->nDigits(strlen($num) - 1);
return $re;
}
private function charClass($b, $e) {
//String.format(b==e ? "%c" : e-b>1 ? "[%c-%c]" : "[%c%c]", b, e); (in java)
if ($b == $e) {
$format = $b;
} elseif ($e-$b>1) {
$format = '['.$b.'-'.$e.']';
} else {
$format = '['.$b.$e.']';
}
return $format;
}
private function nDigits($n, $m=null) {
//String.format(n==m ? n==1 ? "":"{%d}":"{%d,%d}", n, m) (in java)
if($m===null){
nDigits($n, $n);
}
if ($n == $m) { // max/min ranges are the same, so just look for that number of characters
$format = "\{$n\}"; // {n}
} elseif ($n == 1) { // min range is 1, so use the max
$format = "\{1,$m\}"; // {1,m}
} else { // arbitary n->m range
$format = "\{$n,$m\}"; // {n,m}
}
return "[0-9]" . $format;
}
private function eqLengths($from, $to) {
$fc = $from[0];
$tc = $to[0];
if (strlen($from) == 1 && strlen($to) == 1)
return $this->charClass($fc, $tc);
if ($fc == $tc)
return $fc . "(".$this->rangeRegex(substr($from,1), substr($to,1)).")";
$re = $fc . "(" . $this->baseRange(substr($from,1), true, false) . ")|"
. $tc . "(" . $this->baseRange(substr($to,1), false, false) . ")";
if (++$fc <= --$tc)
$re .= "|" . $this->charClass($fc, $tc) . $this->nDigits(strlen($from) - 1);
return $re;
}
private function nonEqLengths($from, $to) {
$re = $this->baseRange($from,true,false) . "|" . $this->baseRange($to,false,true);
if (strlen($to) - strlen($from) > 1)
$re .= "|[1-9]" . $this->nDigits(strlen($from), strlen($to) - 2);
return $re;
}
public function rangeRegex($n, $m) {
return strlen($n) == strlen($m) ? $this->eqLengths($n, $m) : $this->nonEqLengths($n, $m);
}
}
+0
このコードは実行されますしかし、それは私に望ましい結果を与えていません。 $ regexer-> rangeRegex(123,321)に対して;私は(2([31]))を取得しますが、これは正しくありません。 – Ivan
関連する問題
- 1. 範囲外の正規表現番号
- 2. 正規表現の番号の一致
- 3. 正規表現一致番号R
- 4. リストインデックスが範囲外にあり、正規表現の分割が一致する
- 5. 正規表現で番号範囲を確認する
- 6. 文字列の正規表現による範囲の一致
- 7. 範囲番号の正規表現すべての基底
- 8. 正規表現の一致、両方の番号と一致する必要があります
- 9. 日付範囲の正規表現一致
- 10. 正規表現:一致する用語がありますか?
- 11. マルチディジット番号範囲をRuby正規表現と照合するにはどうすればよいですか?
- 12. グループのAnabilities PlaybooksでIP範囲に一致する正規表現
- 13. 正規表現に一致する正規表現(CTLDループ)
- 14. 正規表現に一致する正規表現
- 15. 正規表現に一致する正規表現
- 16. 正規表現のディレクトリパスに一致する正規表現
- 17. 正規表現n番目の一致
- 18. は、電話番号と一致する正規表現が必要です
- 19. 正規表現の番号が90より下にある
- 20. 正規表現に一致するURL
- 21. 正規表現に一致するタグ
- 22. 正規表現に一致するグループ
- 23. グループに一致する正規表現
- 24. が、私はこの正規表現に応じて電話番号をフォーマットする必要があり、この正規表現形式(電話番号)
- 25. 正規表現 - 一致するものがありません
- 26. 正規表現の番号範囲(1から12など)を表す方法は?
- 27. 正規表現の一致とPHP
- 28. 文字列または正規表現のリテラルにない正規表現と一致する正規表現
- 29. 最初に一致する正規表現で一致した正規表現を最初に一致する正規表現
- 30. Rubyの正規表現は、リテラルの一致にのみ一致する方法はありますか?
基本的なJavaとPHPの文法THAT非類似のものではなく、正規表現の構文はかなりあまりにも標準化されています。他の答えの正規表現を自分で翻訳しようとしませんか? –
String.format(n == m?n == 1 "": "{%d}": "{%d、%d}"、n、m) – Ivan