regex - 如何在一个字符串中匹配一个值、一个或两个值?

标签 regex perl

我有一个字符串,可以不包含任何值、一个或两个值。如果有两个值,它们之间用冒号 : 分隔,如果第一个值应为空,则第二个值(唯一的值)将以冒号作为前缀。

第一个值可以由几乎任何字符、字母数字和特殊字符组成,第二个值只能由字母数字字符组成。因此,冒号不是一个独特的分隔符。

我尝试了一些正则表达式,其中大多数仅适用于一个值或第一个没有冒号的两个值,但如果第一个为空,则正则表达式将整个字符串作为第一个值返回。

我的实际代码如下所示:

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/

相关文章:

python - 正则表达式匹配一行但不包含输出中的字符串

用于访问登录 hive serde 的正则表达式

regex - 正则表达式匹配和替换 pvalue 字符串

multithreading - Perl 恢复一个线程

mysql - 如何检查更新后值是否已更改?

python - 用给定列表的元素替换出现的子字符串

java - REGEX 匹配多个条件

perl - Perl中map或grep的使用

perl - 如何将用户数据传递给 perl URI 对象

regex - 多行正则表达式应在文件中匹配多次(如果可能,单行命令)