Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript正则表达式匹配英尺-英寸测量问题_Javascript_Regex - Fatal编程技术网

Javascript正则表达式匹配英尺-英寸测量问题

Javascript正则表达式匹配英尺-英寸测量问题,javascript,regex,Javascript,Regex,我不熟悉正则表达式,我正在尝试创建一个正则表达式来匹配一个字符串,该字符串包含以英尺和英寸表示的度量值,并且可能包含以英寸表示的分数值。到目前为止,我有以下表达: var rex =/\s*(\d+)?\s*(?:'|ft|ft.|feet)?\s*-?\s*(\d+)?\s*(\d+)?\/?(\d+)?\s*(?:''|"|in|in.|inches)?/ 为了尽可能灵活,我将所有捕获设置为可选,以将测量设置为有效的输入数据,如1ft或5' var mstring = '5in'; var

我不熟悉正则表达式,我正在尝试创建一个正则表达式来匹配一个字符串,该字符串包含以英尺和英寸表示的度量值,并且可能包含以英寸表示的分数值。到目前为止,我有以下表达:

var rex =/\s*(\d+)?\s*(?:'|ft|ft.|feet)?\s*-?\s*(\d+)?\s*(\d+)?\/?(\d+)?\s*(?:''|"|in|in.|inches)?/
为了尽可能灵活,我将所有捕获设置为可选,以将测量设置为有效的输入数据,如
1ft
5'

var mstring = '5in';
var match = rex.exec(mstring);
问题是,当正则表达式被应用于
5in
时,我得到的捕获是
match[1]='5'
,而其他三个值(
match[2]
match[3]
match[4]
)保持
未定义

是否有一种方式可以使捕获的值按其定义的顺序显示?
在上述情况下,
match[2]=“5in”
,而
match[1]
match[3]
match[4]
保持
未定义

,诀窍在于在可选部分周围使用非捕获组,并在这些组内部使用强制子模式:

var rex =/(?:\s*(\d+)\s*(?:feet|ft\.|ft|'))?(?:\s*-\s*(\d+))?(?:\s*(\d+)\/)?(?:(\d+)\s*(?:inches|in\.|in|''|"))?/
在第1组中,我将
(?:ft\.\ft\.\ft |')
定为强制性,在第2组中,它是连字符
-
,在第3组中,它是斜杠
/
,在第4组中,它是
(?:英寸英寸英寸英寸英寸英寸英寸英寸英寸英寸英寸英寸英寸英寸英寸英寸英寸英寸英寸英寸英寸英寸英寸英寸英寸英寸英寸英寸英寸英寸英寸英寸英寸英寸英寸英寸英寸英寸英寸英寸英寸英寸英寸英寸英寸英寸英寸英寸英寸英寸英寸英寸英寸英寸英寸英寸英寸英寸英寸英寸英寸英寸英寸英寸英寸英寸英寸英寸英寸英寸英寸英寸英寸英寸英寸英寸

编辑: 我现在不明白逻辑,但是如果您希望
5
in
5in
出现在第二组中,请使用

(?:\s*(\d+)\s*(?:feet|ft\.|ft|'))?(?:\s*-?\s*(\d+))?(?:\s*(\d+)\/)?(?:(\d+)\s*(?:inches|in\.|in|''|"))?
                                         ^

参阅

< P>我会考虑做一些预处理-删除所有空白,并对输入进行一些转换。例如:

// normalize the input, e.g. 5 feet 11 inches becomes 5'11"
// any non-numerical character sequence starting with f is considering feet measurement, similar for inches (i.e. starting with i)
text = text.replace(/[^A-Z0-9'"]*/gi, '').replace(/f[^0-9]*/, "'").replace(/i[^0-9]*/, '"');

// regexp becomes simpler
var re = /(\d+')?(\d+")?/

你能列出你想匹配的所有变体吗?“1ft”“5in”“1ft 5in”“1ft-5in”“2ft 5 15/32in”“4 7/8”“一般情况下匹配将是“1ft 5 7/8”匹配[1]=1匹配[2]=5匹配[3]=7匹配[4]=8非常感谢你的快速响应。我用“5in”测试了解决方案,匹配出现在第四个位置(匹配[4]),而它应该出现在第二位(匹配[2])。有什么想法吗?我引用你的话:在上述情况下,匹配[4]=“5in”,而匹配[1]、匹配[2]和匹配[3]仍然没有定义。所以,正如你所要求的,它在第4组中。很抱歉,我的意思是匹配[2]=5,我只是编辑了这篇文章。我已经更新了正则表达式,但实际上,我不知道你在做什么:)我只希望所有的数据都能转换成英寸:12*匹配[1]+匹配[2]+匹配[3]/匹配[4]避免出现未定义值的问题,如果是这样的话。。。