Объединить позитивный взгляд и негативный взгляд? - PullRequest
2 голосов
/ 28 января 2012

Я плохо разбираюсь в регулярных выражениях, но у меня есть следующее, но я предполагаю, что часть следующих средств ищет 13-16 цифр, а затем возвращает успех, если после этого находит 3-4 цифры. Проблема состоит в том, что 3-4 цифры не обязательны, и они также могут быть перед цифрами 13-16, поэтому я думаю, что я хочу объединить положительный взгляд вперед / взгляд назад, отрицательный взгляд вперед / взгляд назад. Это звучит сложно, есть более простой способ?

(\d{13,16})[<"'].*?(?=[>"']\d{3,4}[<"'])[>"'](\d{3,4})[<"']

, который будет соответствовать ccnum и серии в следующем фрагменте:

<CreditCard> 
     name="John Doe""
     ccnum=""1111123412341231"" 
     series="339"
     exp="03/13">
</CreditCard>

Однако, если я удалю ccnum или серию, она не будет ничего соответствовать, и серия может быть необязательной. Также ряды могут появляться до или после ccnum, поэтому, если я добавлю атрибут series перед атрибутом ccnum, он тоже ничего не будет соответствовать. Это также не соответствует, если у меня есть серия перед ccnum как отдельные элементы, такие как или если я игнорирую элемент серии:

<CreditCard> 
<series>234</series>
<ccnum>1235583839293838</ccnum>
</CreditCard>

Мне нужно, чтобы регулярное выражение соответствовало следующим сценариям, но я не знаю точного названия элементов, в данном случае я просто назвал их ccnum и series.

Вот те, которые работают:

<CreditCard> 
            <ccnum>1235583839293838</ccnum>
            <series>123</series>
</CreditCard>

<CreditCard ccnum="1838383838383833"> 
            <series>123</series>
</CreditCard>

<CreditCard ccnum="1838383838383833" series="139"
</CreditCard>

Также должно соответствовать следующему, но не соответствует:

<CreditCard ccnum="1838383838383833"
            </CreditCard>

<CreditCard series="139" ccnum="1838383838383833" 
            </CreditCard>

<CreditCard ccnum="1838383838383833"></CreditCard>

<CreditCard> 
    <series>123</series>                
    <ccnum>1235583839293838</ccnum>
</CreditCard>

<CreditCard>          
<ccnum series="123">1235583839293838</ccnum>
</CreditCard>

Прямо сейчас, чтобы заставить это работать, я использую 3 отдельных регулярных выражения:

1 соответствует номеру кредитной карты, который указан перед кодом безопасности.

1 соответствует коду безопасности, который указан перед номером кредитной карты.

1, чтобы соответствовать только номеру кредитной карты.

Я попытался объединить выражения в or или, но в итоге получилось 5 групп (2 из первых 2 выражений и 1 из последнего)

Ответы [ 3 ]

0 голосов
/ 28 января 2012

Вы можете попробовать рекурсивно пройти XML-документ и очистить каждый атрибут и текстовый узел, который соответствует вашему выражению для ccnum и series, и добавить их к List<string> ccNumList и List<string> seriesList. Если ccnum и series находятся в одном и том же порядке в иерархии дерева DOM, тогда ccNumList[i] == seriesList[i].

Примером рекурсивного обхода дерева является здесь .

0 голосов
/ 05 января 2013
(?<=[>\"'](\\d{3,4})[<\"'].{0,100})?[>\"'](\\d{13,16})[<\"'](?=.*[>\"'](\\d{3,4})[<\"'])?

Это создаст три группы захвата, где ccnum всегда находится во второй группе, а series может быть в первой, третьей или ни в одной из групп.

ccnum = match.Groups[2].Value;
series = match.Groups[1].Value + m.Groups[3].Value;
0 голосов
/ 28 января 2012

Вероятно, намного проще вытащить XML в XDocument, используя его метод Parse. Затем вы можете использовать XPath или другие средства для поиска этих данных.

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

И вы не можете учесть два разных заказа, кроме как путем включения обоих заказов вручную в регулярное выражение. Поэтому, если вы хотите иметь возможность сопоставлять «ab» и «ba» (в другом порядке), вам нужно следующее регулярное выражение: «((ab) | (ba))». Так что там все дважды. Вы можете уменьшить неприятность этого, выделив «a» и «b» в строковую переменную каждая.

...