0

有没有更简单的方法来编写以下正则表达式,特别是避免使用“?”的所有分组 可选字符?

/^w(o(r(d)?)?)?$/

应该与以下内容匹配:

  • w
  • 工作
  • 单词

并且不应该匹配,仅作为示例:

  • wd
  • wrr
  • 世界
  • wrdo
  • 秩序
  • rd
  • 异地

在这种特殊情况下,它是一个非常短的词,但您可以通过下一个示例看到事情如何很快变得丑陋。

正则表达式匹配每个单词的垂直水平以及任意数量的第一个连续字符:

/^h(o(r(i(z(o(n(t(a(l)?)?)?)?)?)?)?)?)?|v(e(r(t(i(c(a(l)?)?)?)?)?)?)?)$/

我正在使用 ruby​​,但我认为这个问题适用于任何使用正则表达式的语言,所以我会感谢任何语言的答案。虽然对perl不太了解...

我只发现了一个与我类似的问题,但没有显示任何更好的解决方案,无论如何,这里是链接

4

3 回答 3

3

OR你可以用一个表达式来简化它:

/^(w|wo|wor|word)$/

或通过从输入文本(在伪代码中)制作正则表达式来反转测试:

"word" matches /input + ".*"/
于 2012-05-16T02:41:54.173 回答
1

如果你用不同的方式做呢?例如(我不熟悉 ruby​​,所以我将使用 python):

s = "hor"

if "horizontal".startswith (s):
    h = True
if "vertical".startswith (s):
    v = True

或类似的规定

于 2012-05-16T02:37:08.517 回答
0

虽然丑陋且难以阅读,但我会创建一个函数来为每个单词创建正则表达式。例如,如果它是 PHP,我会将其公式化如下:

function rx_from_word($word='',$escapeNeeded=true) {
    $rx = ''; $i = strlen($word);
    while (--$i > -1) {
        if ($escapeNeeded && strpos('|/{}[]().*\\+^$',$word{$i}) !== false) $char = '\\'.$word{$i};
        // I'm not sure if I missed any special character above.
        else $char = $word{$i};
        if ($i > 0) $rx = '(' . $char . $rx . ')?';
        else $rx = $char . $rx;
    }
    return $rx;
}

function rx_from_words($words=array(),$matchFull=false) {
    $rx = $matchFull ? '^' : '';
    foreach ($words as $word) $rx .= rx_from_word($word) . '|';
    return substr($rx,0,-1) . ($matchFull ? '$' : '');
}

$words = array('horizontal','vertical','$10');
$rx = rx_from_words($words,1);
echo "<pre>$rx</pre>";

这将输出

^h(o(r(i(z(o(n(t(a(l)?)?)?)?)?)?)?)?)?|v(e(r(t(i(c (a(l)?)?)?)?)?)?)?|\$(1(0)?)?$

于 2012-05-16T02:53:03.443 回答