Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 正则表达式正则表达式匹配_.net_Regex_C# 4.0 - Fatal编程技术网

.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。