-2

我已经验证了衣服尺码字段,并希望它只接受数字和特定的“单词”,如 S、M、XL、XXL 等。但我不确定如何将单词添加到图案中。例如,我希望它匹配诸如“2、5、23、S、XXXL”之类的有效尺寸,但不匹配诸如“2X3、SLX”之类的字母的随机组合

好的,因为人们没有建议正则表达式解决方案,我想我应该说这是使用正则表达式的更大验证方法的一部分。为了方便和代码一致性,我想用正则表达式来做到这一点。

谢谢

4

6 回答 6

1

如果它们是一组已知的值,我不确定正则表达式是最好的方法。但这里有一个正则表达式,它基本上是你的值的蛮力匹配,每个都有一个 \b (单词边界)锚

\b2\b|\b5\b|\b23\b|\bXXXL\b|\bXL\b|\bM\b|\bS\b
于 2012-07-29T17:41:07.860 回答
0

很抱歉没有给你一个直接的答案。在您的情况下,正则表达式可能是矫枉过正。根据您的需要,没有它的解决方案可能更易于维护。

我不知道您使用哪种语言,所以我将随机选择一种。您可以将其视为一段伪代码。

在 PHP 中:

function isValidSize($size) {
    $validSizeTags = array("S", "M", "XL", "XXL");
    $minimumSize = 2;
    $maximumSize = 23;

    if(ctype_digit(strval($size))) { // explanation for not using is_numeric/is_int below
        if($size >= $minimumSize && $size <= $maxiumSize) {
            return true;
        }
    } else if(in_array($size, $validSizeTags)) {
        return true;
    } else {
        return false;
    }
}

$size = "XS";
$isValid = isValidSize($size); // true

$size = 23;
$isValid = isValidSize($size); // true

$size = "23";
$isValid = isValidSize($size); // true, is_int would return false here

$size = 50;
$isValid = isValidSize($size); // false

$size = 15.5; 
$isValid = isValidSize($size); // false, is_numeric would return true here

$size = "diadjsa";
$isValid = isValidSize($size); // false

(使用ctype_digit(strval($size))而不是is_intor的原因is_numeric是第一个只会对实整数返回 true,而不是像“15”这样的字符串。第二个将对所有数值返回 true,而不仅仅是整数。ctype_digit但是对于包含数字字符,但对于整数返回 false。因此,我们在将值strval发送到之前将其转换为字符串ctype_digits。欢迎来到 PHP 世界。)

有了这个逻辑,您可以轻松地从存储此特定产品的所有有效尺寸的配置文件或数据库中注入 validSizeTags、maximumSize 和 minimumSize。使用正则表达式会变得更加混乱。

于 2012-07-29T17:36:55.703 回答
0

以下是 JavaScript 中的示例:

var patt = /^(?:\d{1,2}|X{0,3}[SML])$/i;


patt.test("2");     // true
patt.test("23");    // true
patt.test("XXXL");  // true
patt.test("S");     // true
patt.test("SLX");   // false
于 2012-07-29T17:47:16.983 回答
0

使用数组成员而不是正则表达式

通过使用不同的方法来表示数据,一些问题更容易处理。虽然正则表达式可能很强大,但如果您主要对定义明确的固定值感兴趣,则最好使用数组成员测试。例如,使用 Ruby:

sizes = %w[2 5 23 S XXXL].map(&:upcase)

size = 'XXXL'
sizes.include? size.to_s.upcase  # => true

size = 'XL'
sizes.include? size.to_s.upcase  # => false
于 2012-07-29T18:30:47.663 回答
0

看到它比我想象的要难,我正在考虑将单独的匹配值存储在一个数组中,并将这些单独的值与接受的值进行匹配。我会用类似的东西

[0-9]+|s|m|l|xl|xxl

并将匹配项存储在数组中

然后我将检查每个数组元素[0-9]+s|m|l|xl|xxl如果它与其中任何一个匹配,则它是有效的。也许有更好的方法,但我不能停留太久

感谢您的帮助

于 2012-07-29T18:53:51.283 回答
0

这将接受替代品一次或多次,以空格或标点符号分隔。如果您认为需要,扩展分隔符类应该很容易。

^([Xx]{0,3}[SsMmLl]|[0-9]+)([ ,:;-]+([Xx]{0,3}[SsMmLl]))*$

如果您可以在将接受的模式用作正则表达式之前将其插入字符串,则可以减少代码重复。

这是一个常规egrep模式。正则表达式方言因语言而异,因此您可能需要调整一些内容以使其适应您选择的语言(PHP?在问题中包含此信息是一种很好的形式)。

于 2012-07-29T19:23:06.137 回答