我有一个字符串,可以不包含任何值、一个或两个值。如果有两个值,它们之间用冒号 :
分隔,如果第一个值应为空,则第二个值(唯一的值)将以冒号作为前缀。
第一个值可以由几乎任何字符、字母数字和特殊字符组成,第二个值只能由字母数字字符组成。因此,冒号不是一个独特的分隔符。
我尝试了一些正则表达式,其中大多数仅适用于一个值或第一个没有冒号的两个值,但如果第一个为空,则正则表达式将整个字符串作为第一个值返回。
我的实际代码如下所示:
if ($string =~ m/^(.+)(\:(\w+)|)$/){
$value1 = $1 || '';
if ($3){$value2 = $3}
}
此方法适用于空字符串,仅第一个值,第一个值中没有冒号的两个值。
编辑:
字符串可能是:
Hello World!
(只有一个值:value1='Hello World!')这是一个测试:123
(两个值:value1='这是一个测试' value2='123'):Banana
(只有一个值:value2='Banana')T3-76:
(只有一个值:value1='T3-76:')Book:Title:Mysql
(两个值:value1='Book:Title' value2='Mysql')
主要问题是如何区分包含冒号和冒号后一些文本的单值字符串与第一个值中没有冒号的双值字符串。我可能应该假设,如果发生这种情况,它是一个二值字符串。
编辑2
如果更容易,可以将代码修改为不匹配空字符串。
有人有想法吗?
最佳答案
也许可以将 split
与否定的先行断言一起使用:
my ($a, $b) = split(/:(?!.*:)/, $string);
请注意,空值可以是 undef
或空字符串。
关于regex - 如何在一个字符串中匹配一个值、一个或两个值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4470979/