Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.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
Regex“;“字符串的开头”;锚不起作用_Regex_Bash - Fatal编程技术网

Regex“;“字符串的开头”;锚不起作用

Regex“;“字符串的开头”;锚不起作用,regex,bash,Regex,Bash,我目前正在使用的正则表达式如下: ^[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?$ 我试图匹配所有浮点数,但只匹配数字。例如,以下内容应匹配: 6.0 1.22E3 -二, 2.9999E-12 但是,以下内容不应匹配: somestring///6.0 我已经在上测试了上述正则表达式,它的工作原理与预期一致。但是,在我的bash脚本中运行它时,没有任何匹配项 这是我的bash代码: if [[ "$VAL" =~ ^[-+]?[0-9]*\.?[0-9

我目前正在使用的正则表达式如下:

^[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?$
我试图匹配所有浮点数,但只匹配数字。例如,以下内容应匹配:

  • 6.0
  • 1.22E3
  • -二,
  • 2.9999E-12
但是,以下内容不应匹配:

  • somestring///6.0
我已经在上测试了上述正则表达式,它的工作原理与预期一致。但是,在我的bash脚本中运行它时,没有任何匹配项

这是我的bash代码:

if [[ "$VAL" =~ ^[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?$ ]]
    then
        echo $VAL, "is a number"
    else
        echo $VAL, "is not a number"
fi
我已经尝试删除锚,它匹配任何包含浮点的字符串。但是,类似“///6.00007”的字符串将匹配。锚按预期工作;但是,^没有

如果您对解决此问题有任何建议,请告诉我

谢谢

编辑1

删除了不好的例子

编辑2

按照@Louger的建议,我在自己的
foo.sh
中运行了正则表达式,代码在我的测试用例中按预期运行。所以我看了一下与正则表达式的比较。当我
echo
ed正在比较的内容时,一切看起来都很好,因此对于正则表达式不匹配的原因没有任何意义

然后我开始怀疑由于某种原因,
echo
没有显示
$VAL
中的实际内容


所以我运行了这个:
NEWVAL=(echo$VAL)
作为一个临时解决方案,直到我能弄清楚发生了什么。

您的正则表达式不允许指数中有小数。指数可能有小数,所以你要么需要更改“数字”的定义,要么需要更改正则表达式

假设是后者,下面是一个更正(Bash 4.4):

<强>但<>强>您应该知道,大多数人认为列表中仅有的两个合法数字是“代码> 6 和<代码> -2 。使用

awk
进行测试非常简单:

$ awk '$1+0==$1{print $0 " is a number"; next} {print $0 " not a number"}' /tmp/f1.txt
6.0 is a number
1.22E3.7 not a number
-2 is a number
2.99999e-0.0001 not a number
somestring///////6.0 not a number
< > > C语言函数,使用代码> AWK<代码>将字符串转换为浮点,被许多其他语言(Ruby、Perl、Python、C、C++、Swift等)使用,因此,如果考虑到格式有效,那么你也可能会编写自己的转换例程。
例如,在大多数语言中,您可以输入
10**1.5
作为合法浮点文本。我所知道的任何语言都不接受以字符串形式出现在
'xx.zzEyy.y'

e
之后的十进制数,事实证明,我与正则表达式进行比较的变量上有前导新行(例如
“\n2.3333”
),这些新行被
echo
去掉。因此,当我用
echo
向屏幕显示这些值时,我会看到变量的精简版本,而不是与正则表达式进行比较的版本


经验教训:
echo
并不总是值得信任的。根据@CharlesDuffy的评论,使用以下选项之一查看变量中的实际内容:
declare-p varname
printf“%q\n'”$varname“
但不要使用
echo$varname

我按原样试用了你的正则表达式和脚本,它们似乎对我很管用`“//6.00007”出来的“不是一个数字”。你是如何运行脚本的?准确地展示你所做的。我将您的代码放入一个文件
foo.sh
,然后
export VAL=“6”
并运行
bash foo.sh
,它说,
6是一个数字。然后我导出了VAL=“/////6.000007”
并运行了
bash foo.sh
,它说,
///6.000007不是一个数字。您可以执行
bash--version
并报告您使用的
bash
版本。您的两个示例,1.22E3.7和2.9999e-0.0001,在指数中有小数点,但您的正则表达式不允许。请使用
声明-p varname
,而不是
echo“$varname”
(尤其是
echo$varname
)为了获得可靠的结果。
printf'%q\n'$varname'
也是值得信赖的。很抱歉,我在帖子中提到的那些“数字”都是我头脑中不好的例子,不是可以与正则表达式进行比较的实际值。事实证明,由于某种原因,
echo$VAL
中存储的值包含的内容与我在其上运行
echo$VAL
时打印到屏幕上的内容不同。所以我这样做了:
NEWVAR=$(echo$VAL)
现在它按预期工作。我不知道为什么,但确实如此。我希望您的
$VAL
包含前导空格
echo$VAL
word拆分并glob扩展变量的内容,而不是按原样打印这些内容,因此这会掩盖该错误。使用
echo“$var”
6.0, is a number
1.22E3.7, is a number
-2, is a number
2.99999e-0.0001, is a number
somestring///////6.0, is not a number
$ awk '$1+0==$1{print $0 " is a number"; next} {print $0 " not a number"}' /tmp/f1.txt
6.0 is a number
1.22E3.7 not a number
-2 is a number
2.99999e-0.0001 not a number
somestring///////6.0 not a number