Regex 我如何编写这个正则表达式以使其与这些术语不匹配?

Regex 我如何编写这个正则表达式以使其与这些术语不匹配?,regex,Regex,我对regex相当陌生。我写这个表达式是为了在文件重命名器(JS)中使用,这样我可以按姓氏排列文件(它们以名字开头,不能更改),它会在所有姓氏以字母开头的文件前面放置一个“!”(在本例中为“A”),这样就可以将它们移动到一个单独的文件夹中。除了几个给出误报的术语外,它工作得非常好,例如:“and”“with”“Jr”“Sn”“II”“III”“IV”。我找不到办法让它忽略这些条款,有可能吗 (^[\w\.\s]+\bA[\w]+(,|\s-|\s&)) !$1 [1] :[见此链接][

我对regex相当陌生。我写这个表达式是为了在文件重命名器(JS)中使用,这样我可以按姓氏排列文件(它们以名字开头,不能更改),它会在所有姓氏以字母开头的文件前面放置一个“!”(在本例中为“A”),这样就可以将它们移动到一个单独的文件夹中。除了几个给出误报的术语外,它工作得非常好,例如:“and”“with”“Jr”“Sn”“II”“III”“IV”。我找不到办法让它忽略这些条款,有可能吗

(^[\w\.\s]+\bA[\w]+(,|\s-|\s&))
!$1
[1] :[见此链接][1]

它必须将这些术语中任何一个“-”“和”“和”“之前的第一个姓氏(最后一个单词)与“Jr”“Sn”“II”“III”“IV”匹配

---------------匹配-------------------

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 
-----------不匹配-------------

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 

您应该能够放置一个可选的交流发电机选择器(x | y | z)?在中间,拿起你列出的那些词。

这只包含了足够的术语来做示例,但这只是一个开始:

(^[\w\.\s]+\bA[\w]+(\s(Jr|III|with[^-]*))?(,|\s-\s.|\s&))
我在regex101示例上尝试了这一点,效果很好

编辑:

在处理第一个字母与选择符匹配的姓氏时,您可以进行负面展望,以确保没有匹配错误的姓氏。除了在某些情况下交换单个匹配字母外,您还需要自定义每个字母的express

在您的示例数据中,对于J,您不希望匹配:

B. A. Arnold Jr, - abc - def01.txt
Dave Ahern with Jo Short - [00].txt.
J Anthony Jones - yawn - zzzz.txt
但我想匹配:

B. A. Arnold Jr, - abc - def01.txt
Dave Ahern with Jo Short - [00].txt.
J Anthony Jones - yawn - zzzz.txt
使用负前瞻将允许您处理Js

这可能比在这样一行正则表达式中尝试使用一个更复杂。

试试这种模式

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

山姆是对的——这件事很难纠正。你为什么要这么做?使用姓氏的第一个字母似乎有点武断——如果您想将文件划分为子目录,但并不真正关心您使用的子目录,那么不值得努力找出哪些部分是姓氏。感谢您的尝试。您的表达式与我的所有尝试都有相同的问题,例如,当使用它查找以“J”或“I”开头的姓氏时,它将匹配“Jr”或“III”,而不是姓氏(将正则表达式中的“A”更改为“J”或“I”,以了解我的意思)。让它忽略这些术语似乎是一件简单的事情,但我似乎找不到一种方法。好吧,你可以通过负面展望来避免这种情况,但你需要修改表达式,而不仅仅是在更改目标字母时交换字母。我将编辑以显示和示例。感谢您的尝试。您的表达式与我的所有尝试都有相同的问题,例如,当使用它查找以“J”或“I”开头的姓氏时,它将匹配“Jr”或“III”,而不是姓氏(将正则表达式中的“A”更改为“J”或“I”,以了解我的意思)。让它忽略这些术语似乎是一件简单的事情,但我似乎找不到一种方法。使用
J(?!r\b)
I(?!I+\b)
S(?!n\b)
而不是
a
@alpha bravo,你知道我如何阻止这种不正确的匹配吗:它错误地匹配了以a开头的单个单词,在和前面吗?谢谢。@alpha-bravo,你是个明星!我从没想过要把它加在最后。这最后一个能在不弄糟其他任何一个的情况下匹配吗?谢谢