推荐答案
测试一下
题目
正则表达式描述了一种字符串匹配的模式,可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等,字符集是指在单个位置上能匹配的各种模式字符的集合,部分字符集的简写形式如下图所示。
A. input wire [3:0] num1
B. // input wire num2
C. // input wire [WIDTH-1:0] num3
D. Input wire [10:0] num4
参考答案与知识点
参考答案
我们分析正则表达式:\W*\s*input\s*wire\s*(\[\d+\:\d+\)*\s*(\w+)\s*
注意:括号是中文全角括号?题目中写的是“(\[\d+\:\d+\)”,看起来是中文左括号和右括号,但实际上正则中一般用英文括号。但这里可能表示匹配括号本身。需要仔细解析。
原表达式:\W*\s*input\s*wire\s*(\[\d+\:\d+\)*\s*(\w+)\s*
其中\W是匹配非单词字符,\s匹配空白,\d匹配数字,\w匹配单词字符。注意括号是中文全角括号,但很可能题目中就是表示字面意义上的括号,但因为正则中括号有特殊含义,所以这里可能是要匹配圆括号字符本身?但写成了全角,可能是个笔误?看选项,选项中有[3:0]这种方括号,没有圆括号。另外注意表达式中有(\[\d+\:\d+\)*,这里*表示前面的括号组重复0次或多次,但括号组内是\[\d+\:\d+\],即匹配方括号内数字:数字。注意:表达式中的括号是中文全角,而方括号是英文半角。实际上,在正则中,要匹配字面括号需要用转义,但这里没有转义,所以可能理解为分组?但通常正则中圆括号用于分组,这里写成了全角,很可能是想表示匹配圆括号字符?但选项中没有圆括号。而且后面还有(\w+),也是全角括号。
再仔细看:\W*\s*input\s*wire\s*(\[\d+\:\d+\)*\s*(\w+)\s*
解读:首先\W*匹配0个或多个非单词字符(比如空格、注释符号等),然后\s*匹配空白,然后input,然后\s*,然后wire,然后\s*,然后一个组(\[\d+\:\d+\)出现0次或多次,但这里组是用全角括号括起来的?通常正则中,如果需要匹配字面括号,应该用转义,但这里没有转义。可能题目意图是匹配可选的位宽部分,即[数字:数字]出现0次或多次(但位宽通常只有一次),然后\s*,然后一个捕获组(\w+)匹配单词(端口名),然后\s*。
注意:全角括号在正则中可能被当成普通字符,但因为没有转义,且通常正则引擎不支持全角括号作为分组,所以很可能这是题目中的书写错误,实际应该是英文半角括号来表示分组?但题目中说“部分字符集的简写形式如下图所示”,但这里没有图,所以我们只能根据常见正则知识推断。
另外,选项中有//注释,所以前面\W*可以匹配//中的斜杠。注意\W匹配非单词字符,包括空格、标点等,但//是两个斜杠,斜杠是非单词字符,所以\W*可以匹配多个斜杠和空格。\s*匹配空白。
然后input必须小写?选项D是Input(首字母大写),所以可能不匹配。选项A有input wire [3:0] num1,符合:\W*可以匹配0个,\s*匹配0个,然后input,\s*,wire,\s*,然后(\[\d+\:\d+\)*:这里需要匹配[3:0],注意表达式中的括号是中文全角,而实际要匹配的是方括号,所以(\[\d+\:\d+\)这个整体应该匹配一个方括号内的数字:数字,但括号本身是分组还是字面?如果括号是字面字符,那么它要求前面有一个中文左括号?但选项中没有中文括号。所以更合理的解释是题目中的括号是误用,实际上应该用英文圆括号表示分组,即(\[\d+:\d+\]),但这里写成了全角。由于题目是选择题,我们根据经验判断。
观察选项B:// input wire num2,前面有//,然后空格,然后input wire num2,没有位宽。正则中有(\[\d+\:\d+\)*,表示0次或多次,所以可以匹配没有位宽的情况。但注意,\W*可以匹配//,但//是两个字符,\W*可以匹配两个非单词字符,然后\s*匹配空格,然后input...,所以B可能匹配。但B中//后面有空格?实际上“// input wire num2”中//后有一个空格,然后input,然后空格,wire,然后空格,num2,所以\W*匹配//,\s*匹配空格,然后input,然后\s*匹配空格,wire,然后\s*匹配空格,然后(\[\d+\:\d+\)*匹配0次,然后\s*匹配空格?注意位宽后面还有一个\s*,这里位宽是0次,所以直接后面是\s*,然后(\w+)匹配num2,最后\s*。但注意num2后面没有多余空格,但\s*可以匹配0个。所以B可以匹配。
选项C:// input wire [WIDTH-1:0] num3,注意位宽部分[WIDTH-1:0],其中WIDTH不是数字,而是字母,正则要求\d+数字,所以无法匹配,因为[WIDTH-1:0]中的WIDTH不是数字,而且还有减号。所以C不匹配。
选项D:Input wire [10:0] num4,Input首字母大写,而正则要求小写input,所以不匹配(除非正则设置忽略大小写,但没说明)。
选项E:input wire [BIT:0] num5,位宽部分[BIT:0],BIT不是数字,所以不匹配。
另外注意,选项A中num1后面没有其他内容,最后一个\s*可以匹配0个空格。所以A应该可以匹配。但A位宽是[3:0],符合\d+:\d+。
因此可能匹配的是A和B。但需要确认正则中的括号问题。如果括号是字面中文括号,那么正则中要求出现中文左括号,然后方括号,然后数字:数字,然后中文右括号,然后星号。这样A中并没有中文括号,所以A不匹配。但题目中写的是“(\[\d+\:\d+\)”,注意右括号也是全角,所以如果字面匹配,那么需要出现全角括号。但所有
涉及知识点
- IC 基础
- 数字电路
- 设计与验证