用于筛选MIPS指令的Bash脚本的正则表达式

用于筛选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语句中使用它来检查输入的文本是否有效,它主

我一直在尝试设计一个表达式来检查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语句中使用它来检查输入的文本是否有效,它主要是我被卡住的带前缀的数字部分

谢谢

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不是我的强项之一,所以我不确定如何单独检查数字部分。你能提供一个例子吗?你能对你的答案提供一些评论或解释吗?