用于筛选MIPS指令的Bash脚本的正则表达式
我一直在尝试设计一个表达式来检查MIPS指令,例如:用于筛选MIPS指令的Bash脚本的正则表达式,bash,mips,Bash,Mips,我一直在尝试设计一个表达式来检查MIPS指令,例如: lw $t1 70000($s0) 我有lw和$t1部分的表达式,但是我被70000($s0)部分卡住了 ($s0)前面的数字不能超过−32768或32767,$必须只存在一次,s部分必须是s或t并且只出现一次,之后的数字只能在s的0-7和t的0-9之间 在此方面的任何帮助都将不胜感激 下面是脚本另一部分中的$s0部分的表达式: ^(\$((s?[0-7])|(t?([0-9]))))$ 我在if语句中使用它来检查输入的文本是否有效,它主
lw $t1 70000($s0)
我有lw
和$t1
部分的表达式,但是我被70000($s0)
部分卡住了
($s0)
前面的数字不能超过−32768
或32767
,$
必须只存在一次,s
部分必须是s
或t
并且只出现一次,之后的数字只能在s的0-7
和t的0-9
之间
在此方面的任何帮助都将不胜感激
下面是脚本另一部分中的$s0
部分的表达式:
^(\$((s?[0-7])|(t?([0-9]))))$
我在if语句中使用它来检查输入的文本是否有效,它主要是我被卡住的带前缀的数字部分
谢谢
EDIT1:我已经成功地使用offset=${w3%(*}
将字符串截断到第一个(
)之前,将值与($s0)
分开。我的脚本不会处理任何诸如(
)之类的内容
我现在需要检查该值是否小于−32768
或大于32767
。您知道如何将其存档吗
EDIT2:感谢所有回复,我已经设法解决了我的问题,并将解决方案作为答案发布。([0-9]{1,5})\(\$(s[0-7]\t[0-9])\
我同意让正则表达式检测一个数字范围是浪费精力的做法。上面的内容捕获了偏移量和寄存器,正如您所描述的,并进行了一些更正和简化。好的,我已经设法解决了这个问题,下面是如何解决的:
offset1=${w3%(*} # retrive the offset of the instruction
if [[ ${offset1:0:1} == "-" ]]; then # if the first char is a - then,
offset1NoSign=${w3%(*} # get the offset number
offset1NoSign=${offset1NoSign##*-} # get rid of the -
echo " This should not have a - sign: $offset1NoSign"
fi
if [[ ( ${offset1:0:1} == "-" && $offset1NoSign -gt "32768" ) || ( $offset1 -gt "32767" ) ]]; then
echo "Out of bounds immediate. Immediates range between −32768 and 32767."
else
---- rest of code ----
它不是很漂亮,但很有效。它首先使用offset1=${w3%(*}
截断字符串,以获取之前的数字(
(例如,-500($s0)
将被截断为-55
)
然后检查第一个字符是否为-
,如果是,请将其删除:
if [[ ${offset1:0:1} == "-" ]]; then # if the first char is a - then,
offset1NoSign=${w3%(*} # get the offset number
offset1NoSign=${offset1NoSign##*-} # get rid of the -
#echo " This should not have a - sign: $offset1NoSign"
fi
接下来,检查它是否超过这两个数字
if [[ ( ${offset1:0:1} == "-" && $offset1NoSign -gt "32768" ) || ( $offset1 -gt "32767" ) ]]; then
echo "Out of bounds immediate. Immediate range between −32768 and 32767."
else
它检查第一个字符是否为-
,是否大于32768
,或者数字是否刚好大于32767
指令的其余部分仅使用正则表达式进行检查。是否有任何理由需要在正则表达式中进行范围检查?使用简单的通用表达式来表示数字会更容易,然后通过引用捕获组来检查特定值。我想这会更容易,但我对bash和re不太熟悉gex不是我的强项之一,所以我不确定如何单独检查数字部分。你能提供一个例子吗?你能对你的答案提供一些评论或解释吗?