← 2022 · MTK联发科 笔试

推荐答案 测试一下

正则表达式描述了一种字符串匹配的模式,可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等,字符集是指在单个位置上能匹配的各种模式字符的集合,部分字符集的简写形式如下图所示。

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*” 其中“(”和“)”是全角括号,而正则表达式通常使用半角,但这里可能是笔误。另外注意在“(\[\d+\:\d+\)”中左括号后紧跟左方括号,中间无空格。匹配时需注意。 解析各部分: - \W* : 匹配0个或多个非单词字符(非字母、数字、下划线)。可以匹配空格、注释符号如//等。 - \s* : 匹配0个或多个空白字符(空格、换行等)。 - input : 精确匹配字符串"input"(注意大小写敏感?默认是大小写敏感的。所以选项D的Input大写I可能不匹配,除非有标志忽略大小写,但题目未说明,按常规正则匹配是大小写敏感的。所以D不匹配)。 - \s* : 空白 - wire : 匹配"wire" - \s* : 空白 - ( : 匹配一个左括号(全角左括号?但选项中是半角左括号?看选项:A是"[3:0]",B无括号,C "//"开头,无括号?C是“// input wire [WIDTH-1:0] num3”,有方括号;D是"[10:0]",E是"[BIT:0]”。注意选项中的括号都是半角方括号,不是圆括号。而正则中写的是全角圆括号“(”,后面紧接“\[”。这里可能存在歧义:可能题目中括号是表示字面量,但通常正则中括号用来分组。仔细看表达式:"(\[\d+\:\d+\)" 中,左括号和右括号是全角的,中间是 \[\d+\:\d+\] 即匹配方括号内数字范围。所以整个“(\[\d+\:\d+\)*”意思是匹配0个或多个“([数字:数字])”这样的组?但注意括号本身是全角,而选项中的括号是半角方括号,所以不匹配?或者可能是排版问题,实际应该是半角括号。因为题目中给出的表达式有全角符号,可能是PDF转换问题。根据IC笔试常见题目,这个正则通常用来匹配Verilog中的端口声明,例如"input wire [3:0] num1"。所以通常写法是:\W*\s*input\s*wire\s*\[\d+:\d+\]\s*\w+\s* 但这里用了全角括号和方括号,且中间有冒号。我们需结合选项判断。 再仔细看:"\W*\s*input\s*wire\s*(\[\d+\:\d+\)*\s*(\w+)\s*" 其中: (\[\d+\:\d+\)* 这里左括号和右括号是全角,但里面是 \[\d+:\d+\](半角方括号)。这个结构可能被解释为:匹配左半角括号?不,全角左括号后跟半角左方括号,很混乱。 合理推测:原题正则应该是:\W*\s*input\s*wire\s*(\[\d+:\d+\])*\s*(\w+)\s* 即匹配可选的端口宽度和端口名。选项中的A、C、D、E都有端口宽度(方括号),B没有端口宽度。另外注释"//"由\W*和\s*匹配,因为/是非单词字符,*表示0次或多次,所以可以匹配注释行。 注意:正则中括号用于分组,这里用了两次括号,第一次是可选宽度,第二次是端口名。但题目中写的是全角括号,可能是表示字面量。但根据选项,B和C以"//"开头,A、D、E以"input"开头。需要看是否匹配。 逐项分析: A: input wire [3:0] num1 - 开头没有非单词字符?\W*匹配0个,然后\s*匹配0个,然后input匹配"input"。然后\s*匹配空格,wire匹配"wire",\s*匹配空格,然后匹配(\[\d+\:\d+\)*:左括号(全角)需匹配?但A中是半角左方括号,不匹配全角左括号,所以可能失败。但如果正则中的括号实际是半角,且用于分组,那么匹配可选的方括号部分。由于表达式中有*,所以宽度部分可选。A的宽度[3:0]符合\[\d+:\d+\],数字加冒号数字。注意正则中冒号是普通字符,不需要转义。然后\s*匹配空格,然后(\w+)匹配端口名num1,\s*匹配末尾空格。看起来A可以匹配,前提是括号是半角分组且不要求字面括号。但题目中全角括号很可能是错误,我们按照半角理解。另外注意:方括号内是\d+:\d+,3:0符合。所以A能匹配。 B: // input wire num2 - 开头"//":\W*匹配两个/(非单词字符),\s*匹配0个或1个?注意"//"后是否有空格?实际是"// "有一个空格,所以\W*匹配两个"/",\s*匹配一个空格,然后input匹配"input",\s*匹配空格,wire匹配"wire",\s*匹配空格,然后(\[\d+\:\d+\)*匹配0次(因为没有宽度部分),然后\s*匹配空格?注意num2前有空格?实际上"wire num2"中间有空格,所以\s*后匹配一个空格,然后(\w+)匹配"num2",然后\s*匹配末尾。注意正则表达式最后有\s*,可以匹配可能末尾空格。B整体可以匹配。但注意:B中"input"前有"// ",\W*和\s*可以匹配,所以B可以匹配。但通常注释行中,input是注释的一部分,但正则没有

涉及知识点

  • Verilog
← 上一题
登录后反馈错题
下一题 →