.net 正则表达式正则表达式匹配
我很难为我的字符串构建正确的正则表达式。我要做的是从字符串中获取所有实体;它们以.net 正则表达式正则表达式匹配,.net,regex,c#-4.0,.net,Regex,C# 4.0,我很难为我的字符串构建正确的正则表达式。我要做的是从字符串中获取所有实体;它们以开头和结尾。实体可以通过大量的数字和前面的来识别。但是,不以“开头或结尾的实体(在本例中是以#开头的电话号码)根本不应匹配 我希望有人能帮助我,或者至少告诉我,我想做的事情不可能在一个正则表达式中实现。谢谢:) 字符串: 'Blaa labalbl balbla balb lbal'#39'blaaaaaaaaa'#39'('blaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
开头和结尾。实体可以通过大量的数字和前面的
来识别。但是,不以“
开头或结尾的实体(在本例中是以#
开头的电话号码)根本不应匹配
我希望有人能帮助我,或者至少告诉我,我想做的事情不可能在一个正则表达式中实现。谢谢:)
字符串:
'Blaa labalbl balbla balb lbal'#39'blaaaaaaaaa'#39'('blaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
RegEx:
“[#[0-9]+]*”
通缉犯:
'#39'
'#39'
'#39'
'#226'
”——“8218”
'#172'
'#39'
找到匹配项:
'#39'
'#39'
”————————————————————————————————————————————————————————————————————————
首先获取单引号之间的所有匹配项:
'[\d#]+'
然后在所有这些匹配中,执行以下操作:
#\d+
所以你最终会得到这样的结果(在C中):
不能在一个正则表达式中执行此操作,需要两个:
首先获取单引号之间的所有匹配项:
'[\d#]+'
然后在所有这些匹配中,执行以下操作:
#\d+
所以你最终会得到这样的结果(在C中):
假设您可以使用lookbehind/lookaheads,并且您的regexp支持可变长度的lookbehind(仅限JGSoft/.NET)
分解它非常简单:
(?<= # Start positive lookbehind group - assure that the text before the cursor
# matches the following pattern:
' # Match the literal '
[#0-9]* # Matches #, 0-9, zero or more times
) # End lookbehind...
#\d+ # Match literal #, followed by one or more digits
(?= # Start lookahead -- Ensures text after cursor matches (without advancing)
[#0-9]* # Allow #, 0-9, zero or more times
' # Match a literal '
)
(?假设您可以使用lookbehind/lookaheads,并且您的regexp支持可变长度lookbehind(仅JGSoft/.NET)
分解它非常简单:
(?<= # Start positive lookbehind group - assure that the text before the cursor
# matches the following pattern:
' # Match the literal '
[#0-9]* # Matches #, 0-9, zero or more times
) # End lookbehind...
#\d+ # Match literal #, followed by one or more digits
(?= # Start lookahead -- Ensures text after cursor matches (without advancing)
[#0-9]* # Allow #, 0-9, zero or more times
' # Match a literal '
)
(?由于您没有指定语言,这里有一个perl解决方案:
#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;
my $s = qq!Blaa lablalbl balbla balb lbal '#39'blaaaaaaaa'#39' ('#39#226#8218#172#39') blaaaaaaaa #7478347878347834 blaaaa blaaaa!;
my @n = $s =~ /(?<=['#\d])(#\d+)(?=[#'\d])/g;
print Dumper(\@n);
由于您没有指定语言,这里有一个perl解决方案:
#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;
my $s = qq!Blaa lablalbl balbla balb lbal '#39'blaaaaaaaa'#39' ('#39#226#8218#172#39') blaaaaaaaa #7478347878347834 blaaaa blaaaa!;
my @n = $s =~ /(?<=['#\d])(#\d+)(?=[#'\d])/g;
print Dumper(\@n);
@ApoY2k是因为它没有被字符直接包围。
字符,我猜。可能(可能)是错误的。"7478347834是不允许的,因为它是字符串的一部分,因此不是实体。@ApoY2k是因为它没有被字符直接包围。
字符,我猜。可能(可能?)但是,这是错误的。#7478347878347834是不允许的,因为它是字符串的一部分,因此不是一个实体。太糟糕了,在一个正则表达式中不可能这样做,我猜这就必须这样做。谢谢您也为我键入它;)Gnarf发布了一个在一个正则表达式中完成的答案,谢谢!可惜在一个正则表达式中不可能完成,我猜这必须完成。谢谢你也为我打印出来;)Gnarf发布了一个在一个正则表达式中完成的答案,谢谢!哇,太棒了!正是我想要的。你能解释一下这到底是做什么的吗?非常感谢:)@Willy——老实说——我投票赞成@Jan的答案。。更容易理解你在那里做什么…你是对的,先生。这更容易理解,但如果可能的话,我想在一个正则表达式中完成,这就是您的方法所做的:)。哪种方法更快、性能更好?@Willy-很难说哪种方法性能更好(特别是因为我没有.NET编译器),你应该设置一些分析测试来看看……哇,这太完美了!正是我想要的。你能解释一下这到底是做什么的吗?非常感谢:)@Willy——老实说——我投票赞成@Jan的答案。。更容易理解你在那里做什么…你是对的,先生。这更容易理解,但如果可能的话,我想在一个正则表达式中完成,这就是您的方法所做的:)。哪种方法更快、性能更好?@Willy-很难说哪种方法性能更好(特别是因为我没有.NET编译器),你应该设置一些分析测试来看看……我不知道RegEx是特定于语言的,RegEx位是通用的,对吗?这也会起作用,#\d+(?=#|')。谢谢您的正则表达式比Gnarf发布的要短得多,有什么区别吗?他唯一的测试是匹配后的字符是
或
--并且不是所有的正则表达式都可以处理向前看、向后看等。如果您在测试字符串中之后加上
,然后它也会匹配…@gnarf:是的,你是对的,我已经更新了regex,添加了一个固定长度的lookbehind,因为在perl和其他一些语言中不允许可变长度的lookbearound。我不知道regex是特定于语言的,regex位是通用的,对吗?这也会起作用,#\d+(?=#|')。谢谢您的正则表达式比Gnarf发布的要短得多,有什么区别吗?他唯一的测试是匹配后的字符是
或
--并且不是所有的正则表达式都可以处理向前看、向后看等。如果您在测试字符串中之后加上
,然后它也会匹配…@gnarf:是的,你是对的,我已经更新了regex,添加了一个固定长度的lookbehind,因为在perl和其他一些语言中不允许可变长度的lookbehind。