正则表达式忽略第一个字符,如果它是$

时间:2014-12-06 14:25:02

标签: regex

一直在努力争取这个...

ABC 123 标签 123 标签 534

$ DEF564 (Hello World)这里的Arbit-rary

我希望得到匹配的文字:

ABC 123

DEF564

这几乎解释了我想要匹配的文字 [ - A-Z0-9_] + (我的例子并未涵盖所有可能性)

问题在于它是行 ^ 文本

的开头

所以 ^ [ - A-Z0-9_] + 会匹配第一个示例,但当然会在第二个例子中失败。

如何编写正则表达式忽略第一个位置的$?这是我的源文本中唯一可能在第一个字符中有$或$ $但我不希望这个$成为匹配文本结果字符串的一部分。

我确信对于那些了解正则表达式的人来说并不难,但我的正则表达能力相当有限,所以这就是为什么我花了很多时间在这上面并且无处可去。

所以我需要的答案是

^ IgnoreDollarSignInFirstCharacterIfPresent [-A-Z0-9_] +

4 个答案:

答案 0 :(得分:1)

如果您希望将整个匹配作为目标,请使用后面的内容:

(?<=^\$|^)[-A-Z0-9 ]+

请参阅demo

答案 1 :(得分:0)

在perl中测试:

$ echo 'ABC 123 tab 123 tab 534
$DEF564 tab 456 tab 5454' | perl -lne '/^\$?\K(?:[-A-Z\d_\s])+/ and print $&' 
ABC 123 
DEF564

所以正则表达式是:

^\$?\K(?:[-A-Z\d_\s])+

答案 2 :(得分:0)

您可以使用以下正则表达式并从组索引1中获取所需的字符串。

^\$?([-A-Z0-9_ ]+)

$是regex中的一个特殊的meta charcater,它代表了行锚的结束。因此,您需要将其转义为与文字$符号匹配。此外,?符号后面的$会将之前的$符号设为可选。

DEMO

$ echo 'ABC 123 tab 123 tab 534
$DEF564 tab 456 tab 5454' | perl -lne '/^\$?([-A-Z0-9_ ]+)/ and print $1'
ABC 123 
DEF564 

简单地说,你可以使用,

^\$?\K[^\t]+

[^\t]+匹配任何字符,但不匹配\t一次或多次。

答案 3 :(得分:0)

如果我正确地理解了你的问题,我相信你想要一个不包含美元符号的正则表达式,即使它存在,在这种情况下你给出了以下正则表达式的两个例子也可以。

([A-Z]){3}\s?([0-9]){3}

它将匹配所有有3个大写字母的地方,后跟3个数字,中间有可选的空格。如果您想匹配任意数量的大写字母,后跟任意数量的数字,请将量词({3})替换为+。

演示:https://regex101.com/r/gW7mT8/1