2012-01-27 3 views
2

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

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

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

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

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

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

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

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

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

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

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

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

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

Я попытался Комбинируя выражения в ОШ, но я в конечном итоге с 5 полных групп (2 из первых 2-х выражений и 1 из последнего)

+0

Что не так с '\ d {13,16}'? – leppie

+0

@leppie - Это просто соответствует ccnum, а не номер дополнительной серии – Xaisoft

+10

. Тогда вы не должны использовать регулярное выражение для этого. Просто используйте синтаксический анализатор XML и проверьте значения с помощью регулярных выражений. Вы даже можете использовать XML-схему для проверки значений. – leppie

ответ

0

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

Что касается регулярных выражений: вы, регулярное выражение, сложны для меня, чтобы понять, но это то, как вы делаете определенный блок необязательным: «(thisisoptional)?».

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

+0

не может использовать xpath, потому что xml меняется. – Xaisoft

0

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

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

+0

ccnum и серия - это просто примеры, он варьируется от xml до xml, поэтому я не могу разобрать его с помощью анализатора xml. – Xaisoft

+0

@ Xaisoft - Не имеет значения, какие имена элементов и атрибутов есть, если вы просто проверяете каждый текстовый узел и атрибут на свои регулярные выражения для ccnumber и series. Ключ состоит в том, что числа будут отображаться в том же порядке в файле (что истинно, если у файла нет своего рода вторичный идентификатор для них), два списка должны быть в том же порядке. –

0
(?<=[>\"'](\\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;