我想验证一个必须是-key1 value1 -key2 value2
的字符串。key
允许使用大写/小写字符、数字和下划线。例如-key_1
或-Key_name_2
value
可以是任何字符串,但不能是空字符串。所以,value
可以是value1
,-value1
。此外,value
可以是带双引号的"value1WithQuote"
,我们从双引号中提取值为value1WithQuote
。
键值对的数量最多可达10对。
我尝试使用下面的正则表达式,但它只检查第一个键
str="-mykey1 keyvalue1 -MY_KEY_2 keyvalue2"
regex="-([a-zA-Z]+)"
[[ $str =~ $regex ]] && echo "matched"
你能给予我一些建议吗?
3条答案
按热度按时间lymnna711#
有一个很好的机会,你的起始
str
实际上应该被填充为一个数组而不是一个字符串,但是如果你的值都不能包含白色空格,下面是你如何将它转换为数组并使用它的方法:如前所述,上面假设您的值都不包含白色空间,否则以这种方式填充数组将失败。
编辑:说明为什么你应该把参数存储在数组中而不是字符串中:
第一个循环是将参数值存储在数组中,第二个是访问它们的值。
我假设你有一些理由希望参数值被存储,否则你可以在上面的第二个循环中执行
for arg in "$@"
,然后去掉第一个循环。jdzmm42g2#
我将遍历字符串并检查每个键值对,它使用修改后的正则表达式
-([a-zA-Z_0-9]+) ([^ ]+)
,其中([a-zA-Z_0-9]+)
匹配键,([^ ]+)
匹配值,while
循环继续,直到字符串中没有更多的键值对。看看这个
更新
正如你所要求的,我将从字符串中提取键值对,并将它们存储在一个关联数组(
keyValuePairs
)中,我还执行了额外的检查,以检查重复键、空值和键值对的最大数量,最后,它打印提取的键值对!2ledvvac3#
您可以使用
^
-字符串的开头-
-连字符[a-zA-Z0-9_]+
-一个或多个字母/数字/下划线( [a-zA-Z0-9]+)?
-可选出现:[a-zA-Z0-9]+
-一个或多个字母/数字( -[a-zA-Z0-9_]+( [a-zA-Z0-9_]+)?)*
-零次或多次出现空格+与上面相同的模式$
-字符串结束。