如何接受数字和特定字词?

时间:2012-07-29 17:27:50

标签: regex

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

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

由于

6 个答案:

答案 0 :(得分:1)

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

\b2\b|\b5\b|\b23\b|\bXXXL\b|\bXL\b|\bM\b|\bS\b

答案 1 :(得分:0)

很抱歉没有给你一个直截了当的回答。在你的情况下regexp可能有点矫枉过正。根据您的需要,没有它的解决方案可以更易于维护。

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

在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_intis_numeric的原因是第一个只会返回真实整数,而不是像“15”这样的字符串。而第二个将为所有数值而不仅仅是整数返回true。但ctype_digit将对包含数字字符的字符串返回true,但对整数返回false。因此我们在将值发送到strval之前将其转换为字符串ctype_digits。欢迎来到PHP的世界。)

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

答案 2 :(得分: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

答案 3 :(得分: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

答案 4 :(得分:0)

看到它比我想象的更难,我想将各个匹配的值存储在一个数组中,并将这些值与可接受的值进行匹配。我将使用像

这样的东西

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

并将匹配项存储在数组

然后我将针对[0-9]+s|m|l|xl|xxl检查每个数组元素,如果它与其中任何一个匹配,则它是有效的。也许有更好的方法,但我不能长期讨论这个问题

感谢您的帮助

答案 5 :(得分:0)

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

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

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

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