RegEx查找数据中字符串的最终出现[重复]

imzjd6km  于 9个月前  发布在  其他
关注(0)|答案(4)|浏览(58)

此问题已在此处有答案

Regex Last occurrence?(7个回答)
上个月关门了。
我一直在寻找类似的例子,但我还没有能够使任何工作非常适合我的用例。
我有一个处理用户标题的数据块,包括历史数据。对于每个用户,根据他们之前是否有过标题更改,数据可能会出现1到10次,按日期堆叠。我需要最新的标题,它似乎总是位于底部,由字符串“customBusinessTitle=”后面的任何内容标识。
下面是数据的一个例子:
id=2039,邮箱Id =123,customertiveDate 7 =2018-02-22,customFINDepartment=销售和市场营销,customBusinessTitle=副总裁,通信,customTitleDetails=; id=2457,用户ID =123,customertiveDate 7 =2021-05-10,customFINDepartment=通信,customBusinessTitle=通信副总裁,customTitleDetails=; id=5735,用户ID =123,customCompletiveDate 7 =2022-09-16,customFINDepartment=通信,customBusinessTitle=通信副总裁,customTitleDetails=通信副总裁; id=7769,用户ID =123,customCompletiveDate 7 =2022-09-18,customFINDepartment=通信,customBusinessTitle=通信副总裁,customTitleDetails=通信副总裁; id=9811,用户ID =123,customertiveDate 7 =2023-01-01,customFINDepartment=通信,customBusinessTitle=通信副总裁,customTitleDetails=通信副总裁
我的计划是在实际头衔信息之前和之后使用字符串,以“括住”我需要提取的内容-在本例中是“Vice President,Communications”,因为它出现在“customBusinessTitle=”和“,customTitleDetails”之间,用于数据中最近(最终)出现的内容。
我在https://regex101.com上试过的几个搜索:

(?<=customBusinessTitle=)(.+)(?=, customTitleDetails)
  • 这似乎只返回第一次出现-这是类似的,但我需要最近的标题日期,这似乎是在底部。
(?<=customBusinessTitle=)([^,]*)(?:(?!.*customBusinessTitle=).)*(?<!, customTitleDetails=)
  • 我真的有点搞不懂它似乎返回了多次出现的“Vice President”,但切断了“,Communications”(我需要的),然后在最后一次出现时,它匹配了从“customBusinessTitle”到行尾的所有内容,这比我需要的要多。我把它包括进来只是因为它和最后一次发生的情况不同。
(?<=customBusinessTitle=)([^,]*)(?:(?!.*customBusinessTitle=).)(?<!, customTitleDetails=)
  • 这一个似乎最接近我所需要的-它只返回最后一次出现,但它在标题中的逗号处切断,而我需要它来捕获整个标题。

我觉得很接近最后一个,但我不太明白如何让它包括整个标题,而不是只有“副总统”-任何建议?
感谢您的关注!!

最终编辑:@波希米亚人和@大卫都找到了可行的解决方案-谢谢你们两个,我希望我能标记不止一个答案!

感谢所有提供意见和建议的人,我很感激!

qoefvg9y

qoefvg9y1#

customBusinessTitle=使用负向前查找,以确保仅匹配 * 最后一个 * 出现。在前后添加环视以仅匹配您的目标:

(?<=customBusinessTitle=)(?!.*customBusinessTitle=).*?(?=, \w+=|;|$)

请参见live demo
注:根据问题的变化对答案进行了调整
细分:

  • (?<=customBusinessTitle=)前面的字符是customBusinessTitle=
  • (?!.*customBusinessTitle=)字符customBusinessTitle=在以下输入中的任何地方都 * 找不到 *
  • .*?匹配尽可能少
  • (?=, \w+=|;|$)以下字符是另一个字段、分号或输入结束
kupeojn6

kupeojn62#

(?<=customBusinessTitle=)(?!.*customBusinessTitle=).*?(?=$|;|(, \w+=))

对@bohemian的优秀回答进行了一些改进:匹配的结束可以是任何新键(, \w+=)、组的结束(;)或字符串的结束($)。

  • 通过customBusinessTitle=预处理(正向后看)
  • *not后跟 * customBusinessTitle=(负先行)
  • 尽可能少地匹配任何东西
  • 然后是行结束($)或组结束(;)或下一个键(, \w+=)。(积极前瞻)
    Live demo
7qhs6swi

7qhs6swi3#

在该方法中:

(?<=customBusinessTitle=)(.+)(?=, customTitleDetails)

你可以尝试将lookahead字符串锚定到输入的末尾。从我的头上:

(?<=customBusinessTitle=)(.+)(?=, customTitleDetails=[A-Za-z,]+$)

(我也想到在结尾处使用某种形式的懒惰:customTitleDetails=.+?$。由于正则表达式匹配通常是如何实现的,这可能仍然不起作用。

编辑@Bohemian的做法绝对更好,把这个答案留在这里以防万一

rm5edbpk

rm5edbpk4#

我需要最新的标题,它似乎总是在底部,并由字符串“customBusinessTitle=”. *

  • .我需要提取-在本例中是“Vice President,Communications”,因为它出现在“customBusinessTitle=”和“,customTitleDetails”之间,用于数据中最近(最终)出现的情况。...'*

要捕获最后一个示例,请在静态文本前面加上.+

.+customBusinessTitle=(.+), customTitleDetails=
Vice President, Communications
[Vendor] Senior Accounting Manager
Senior Information Technology Manager
Identity & Access Management Specialist

相关问题