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

Regex 如何接受数字和特定单词?,regex,Regex,我有一个衣服尺寸字段,希望它只接受数字和特定的“单词”,如S、M、XL、XXL等。但我不确定如何将这些单词添加到图案中。例如,我希望它匹配“2,5,23,S,XXXL”之类的有效大小,但不匹配“2X3,SLX”之类的随机字母组合 好吧,既然人们没有建议使用regexp解决方案,我想我应该说这是使用regexp的更大验证方法的一部分。为了方便和代码一致性,我想用regexp实现这一点 谢谢很抱歉没有给你一个直截了当的回答。在您的情况下,regexp可能有点过头了。根据您的需要,没有它的解决方案可能

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

好吧,既然人们没有建议使用regexp解决方案,我想我应该说这是使用regexp的更大验证方法的一部分。为了方便和代码一致性,我想用regexp实现这一点


谢谢

很抱歉没有给你一个直截了当的回答。在您的情况下,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
函数isValidSize($size){
$validSizeTags=数组(“S”、“M”、“XL”、“XXL”);
$minimumSize=2;
$maximumSize=23;
if(ctype_digit(strval($size)){//不使用is_numeric/is_int的解释如下

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


下面是一个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
使用数组成员身份而不是正则表达式 通过使用不同的方法来表示数据,有些问题更容易处理。虽然正则表达式功能强大,但如果您主要对定义良好的固定值感兴趣,则最好使用数组成员资格测试。例如,使用Ruby:

size=%w[2 5 23 S XXXL]。映射(&:upcase)
尺寸='XXXL'
大小。包括?大小。到美国大写字母#=>正确
大小='XL'
大小。包括?大小。到美国大写字母#=>假

鉴于这比我想象的要困难,我正在考虑将各个匹配的值存储在一个数组中,并将它们分别与接受的值进行匹配

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

并将匹配项存储在数组中

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


感谢您的帮助

这将接受备选方案一次或多次,以空格或标点符号分隔。如果您认为需要,扩展separator character类应该很容易

^([Xx]{0,3}[SsMmLl]|[0-9]+)([ ,:;-]+([Xx]{0,3}[SsMmLl]))*$
如果可以在将接受的模式用作正则表达式之前将其插入字符串中,则可以减少代码重复


这是一种常规的
egrep
模式。不同语言之间的Regex方言不同,因此您可能需要调整一些东西以使其适应您选择的语言(PHP?在问题中包含此信息是一种很好的形式).

我想匹配一个包含多个单词的字符串,而不是将它们一一匹配。如果字符串看起来像
“2,5,23,S,XXXL”
那么你可以使用类似于
/^(?:\d{1,2}X{0,3}[SML])(,\S}$)的正则表达式+$/i
问题是我已经有了一个验证系统,为了代码的一致性,我想使用它。它使用正则表达式。我只需要在其中使用某种模式。一致性是关键,特别是如果你能够在后端和前端之间共享验证规则。你的解决方案听起来很有趣无论如何,我需要验证一个字符串是否只包含数字和某些单词,而不是单独匹配它们
^([Xx]{0,3}[SsMmLl]|[0-9]+)([ ,:;-]+([Xx]{0,3}[SsMmLl]))*$