2014-10-17 2 views
0

Я довольно новичок в регулярном выражении. Я написал это выражение для использования в File Renamer (JS), поэтому я могу упорядочить файлы по фамилии (они начинаются с первого имени и не могут быть изменены), он помещает «!» infront всех файлов, фамилия которых начинается с буквы, на которую она установлена ​​(в этом случае «A»), чтобы затем их можно было перемещать в отдельную папку. Он отлично работает, за исключением нескольких терминов, которые дают ложные срабатывания, т. Е. «И» «с» «Jr» «Sn» «II» «III» «IV». Я не могу найти способ заставить его игнорировать эти условия, возможно ли это?Как написать это Regex, чтобы не соответствовать этим условиям?

(^[\w\.\s]+\bA[\w]+(,|\s-|\s&)) 
!$1 

[1]: http://regex101.com/r/qU4yJ6/4 [См ссылку] [1]

Он должен соответствовать первой фамилии (последнее слово), прежде чем любой из этих терминов "-" "&" "" «и "" с "" Jr "" Sn "" II "" III "" IV "

--------------- MATCH ----------- --------

John Albert - Work00 - october.txt 
Fred Allen - blah 01 - Whatever.txt 
B. B. Archer - blah.txt 
John M. Aines - Abcdef - {12345}.txt 
A Arthur - abcdef.txt 
Alex Abbott & Jane Doe - details.txt 
D.C. Atkins, John Smith - Zxy123.txt 
B. A. Arnold Jr, - (or Sn,) - def01.txt 
Paul Adams III - (or II or IV).txt 
Dave Ahern with Jo Short - [00].txt 

----------- НЕ СООТВЕТСТВУЕТ -------------

J Anthony Jones - yawn - zzzz.txt 
Rand Sony et al - title.txt 
AA Smith - lalala.txt 
A.A. Bloggs - info00 - November.txt 
A A Bilner - testing1234.txt 
A. Lebert - Anything - October.txt 
A Doe - etc - etc.txt 
A & A Dell - Defghi.txt 
A and A Bell - asdfghjkl.txt 
+1

[Обязательная ссылка об использовании регулярных выражений для сопоставления имен.] (Http://www.kalzumeus.com/2010/06/17/falsehoods-programmers- верить-о-именах /) – Sam

+0

Сэм прав - это трудно понять. Зачем вам это делать? Использование первой буквы фамилии кажется немного произвольным выбором - если вы хотите разделить файлы на подкаталоги, но не важно, какие подкаталоги вы используете, то не стоит пытаться определить, какие части являются фамилиями. –

ответ

1

попробовать этот паттерн

^(?:(?![-&,]|and|with|Jr|Sn|II|III).)*\b(A\w+)\b(?=\s*(?:[-&,]|and|with|Jr|Sn|II|III)) 

Demo

+0

Спасибо, что попробовали. Ваше выражение имеет ту же проблему, что и все мои попытки. Например, когда вы используете его для поиска фамилий, начинающихся с «J» или «I», он будет соответствовать «Jr» или «III» вместо фамилии (измените «A», в регулярном выражении J или I, чтобы понять, что я имею в виду). Похоже, было бы просто заставить его игнорировать эти термины, но я не могу найти способ сделать это. – Zarnia

+0

используйте 'J (?! R \ b)', 'I (?! I + \ b)' и 'S (?! N \ b)' вместо 'A' –

+0

Это делает трюк, спасибо! – Zarnia

0

Вы должны быть в состоянии поставить дополнительный селектор переменного тока (x | y | z)? в середине этого, чтобы подобрать те термины, которые вы перечисляете.

Это только имеет достаточно ваши условия, чтобы сделать ваши примеры, но его начало:

(^[\w\.\s]+\bA[\w]+(\s(Jr|III|with[^-]*))?(,|\s-\s.|\s&)) 

Я попробовал на regex101 образце, и она работала.

EDIT:

Столкнувшись с обработкой фамилиями которых первая буква соответствует селектор генератора вы можете сделать отрицательный предпросмотр, чтобы убедиться, что вы не соответствующие неправильные вещи. Вам нужно будет настроить экспресс на письмо за пределами просто замены одной буквы соответствия в некоторых случаях.

в вас, например, данные, для J, вы никогда не хочешь, чтобы соответствовать:

B. A. Arnold Jr, - abc - def01.txt 
Dave Ahern with Jo Short - [00].txt. 

, но хотели бы, чтобы соответствовать:

J Anthony Jones - yawn - zzzz.txt 

Использование отрицательного предпросмотра позволит вам обрабатывать Js. J|Jr Example

(^[\w\.\s]+\bJ(?!r,)[\w]+(\s(Jr|III|with[^-]*))?(,|\s-\s.|\s&)) 

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

+0

Спасибо за попытку.Ваше выражение имеет ту же проблему, что и все мои попытки. Например, когда вы используете его для поиска фамилий, начинающихся с «J» или «I», он будет соответствовать «Jr» или «III» вместо фамилии (измените «A», в регулярном выражении J или I, чтобы понять, что я имею в виду). Похоже, было бы просто заставить его игнорировать эти термины, но я не могу найти способ сделать это. – Zarnia

+0

Ну, вы можете избежать этого остроумия с негативным взглядом, но вам нужно модифицировать выражение немного больше, чем просто заменять букву при изменении целевых букв. Я отредактирую, чтобы показать и пример. –

Смежные вопросы