对于我的搜索面板,我必须过滤如下所示的字符串:
'4dan-7kyu' or '4dan - 7kyu' or '10kyu' or '10 kyu' or '2dan' or '2 dan' or '4-7' or '4 - 7' or '10'
只允许:
1-10
中的数字;- 单词不区分大小写,包括:
dan
、kyu
、дан
、кью
; - 破折号(不超过一个且从不在字符串的开头,从不
-10kyu
或从不-10
); - 空格(不超过一次,但绝不会出现在字符串的开头);
我在想这样的事情,但它对我来说从来没有完全奏效:
/([1-9]|10)\s-\s|dan|kyu|дан|кью/i
编写这种正则表达式的正确方法是什么?
编辑 1:
- 空格(不超过一次,但绝不在字符串的开头)
无效示例:4dan___-___7kyu
或_4dan_-_7kyu
有效示例:4dan-7kyu
和4dan - 7kyu
和4 dan - 7kyu
和4 dan - 7 kyu
编辑 2:
更多无效示例:
12dan-7kyu
或 12dan-11kyu
最佳答案
我猜是:
/(^([1-9]|10)\s*$)
|
(^([1-9]|10)\s?-\s?([1-9]|10)\s*$)
|
(^([1-9]|10)\s?(dan|kyu|дан|кью)\s*$)
|
(^([1-9]|10)\s?(dan|kyu|дан|кью)\s?-\s?([1-9]|10)\s?(dan|kyu|дан|кью)\s*$)/ixu
这是 PHP 示例:
$rgData = ['12', '20dan', ' 1kyu - 4kyu ', '1kyu - 4kyu ',
'1 kyu - 4 kyu', '1 kyu-4 kyu','4dan-7kyu', '4dan - 7kyu',
'10kyu', '10 kyu', '2dan', '2 dan', '4-7', '4 - 7', '10'];
$sPattern = '/(^([1-9]|10)\s*$)
|
(^([1-9]|10)\s?-\s?([1-9]|10)\s*$)
|
(^([1-9]|10)\s?(dan|kyu|дан|кью)\s*$)
|
(^([1-9]|10)\s?(dan|kyu|дан|кью)\s?-\s?([1-9]|10)\s?(dan|kyu|дан|кью)\s*$)/ixu';
var_dump(array_filter($rgData, function($sItem) use ($sPattern)
{
return preg_match($sPattern, $sItem, $rgMatches);
}));//first 3 not matched
附言向武术同仁问好!
关于php - 用于过滤具有破折号、空格、数字和某些单词的具有挑战性的字符串的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18482159/