RegEx матч RegEx - PullRequest
       1

RegEx матч RegEx

0 голосов
/ 14 сентября 2010

У меня проблемы с созданием правильного регулярного выражения для моей строки. Что я хочу сделать, это получить все сущности из моей строки; они начинаются и заканчиваются '. Объекты могут быть идентифицированы по количеству цифр и # впереди. Однако сущности (в данном случае номер телефона, начинающийся с #), которые не начинаются или не заканчиваются на ', вообще не должны совпадать.

Я надеюсь, что кто-то может мне помочь или, по крайней мере, сказать мне, что то, что я хочу сделать, невозможно в одном выражении. Спасибо:)

Строка:

'Blaa lablalbl balbla balb lbal '#39'blaaaaaaaa'#39' ('#39#226#8218#172#39') blaaaaaaaa #7478347878347834 blaaaa blaaaa'

RegEx:

'[#[0-9]+]*'

Требуются матчи:

  • '#39'
  • '#39'
  • '#39'
  • '#226'
  • '#8218'
  • '#172'
  • '#39'

Найдено совпадений:

  • '#39'
  • '#39'
  • '#39#226#8218#172#39' <- <strong>Необходимо разделить (если возможно в том же RegEx)

Еще один RegEx:

#[0-9]+

Найдено совпадений:

  • '#39'
  • '#39'
  • '#39'
  • '#226'
  • '#8218'
  • '#172'
  • '#39'
  • '#7478347878347834' <- <strong>Не должно быть здесь: (

Язык: C # .NET (4.0)

Ответы [ 3 ]

3 голосов
/ 14 сентября 2010

Вы не можете сделать это в одном регулярном выражении, вам понадобится два:

Сначала возьмите все совпадения, заключенные в одинарные кавычки:

'[\d#]+'

Затем выполните все эти совпадения, сделайте это:

#\d+

Таким образом, вы получите что-то вроде (в C #):

foreach(var m in Regex.Matches(inputString, @"'[\d#]+'"))
{
    foreach(var m2 in Regex.Matches(m.Value, @"#\d+"))
    {
          yield return m2.Value;
    }
}
1 голос
/ 14 сентября 2010

Поскольку вы не указываете язык, вот решение в 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);

Вывод:

$VAR1 = [
          '#39',
          '#39',
          '#39',
          '#226',
          '#8218',
          '#172',
          '#39'
        ];
1 голос
/ 14 сентября 2010

Предполагая, что вы можете использовать lookbehind / lookaheads и что ваше регулярное выражение поддерживает lookbehinds переменной длины (только JGSoft / .NET)

(?<='[#0-9]*)#\d+(?=[#0-9]*')

Должно работать ... Протестировано с использованием этого сайта и получили следующие результаты:

   1. #39
   2. #39
   3. #39
   4. #226
   5. #8218
   6. #172
   7. #39

Разбить его довольно просто:

(?<=        # 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 '
)

Итак, этот шаблон будет соответствовать #\d+, если текст перед ним '[#0-9]* итекст после [#0-9]*'

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...