RegEx查找或匹配后跟特定单词(锚定)的上域

RegEx查找或匹配后跟特定单词(锚定)的上域,regex,autohotkey,Regex,Autohotkey,我有一个文本块或字符串: (Ex.1) domain of doorstops-scripts.asjewelries.com designates 88.198.68.211 as permitted sender (Ex.2) domain of aiceo.net designates 193.105.73.148 as permitted sender 我想匹配/查找上层域:asjewelries.com或aiceo.net) 即.com,.net,.info,.tv等(前面有点的2-

我有一个文本块或字符串:

(Ex.1) domain of doorstops-scripts.asjewelries.com designates 88.198.68.211 as permitted sender
(Ex.2) domain of aiceo.net designates 193.105.73.148 as permitted sender
我想匹配/查找上层域:
asjewelries.com
aiceo.net

.com
.net
.info
.tv
等(前面有点的2-5个字符),前面的字符跟在一个点后面(
在Ex.1中为Jewelries
),或者如果空格后面没有较低的域(
在Ex.2中为aiceo

这两个域后面都跟有一个特定的词(锚):
指定
。他们可以紧跟着这个锚,或者在他们之间可能有其他的词

这就是目标:

asjewelries.com (Ex.1)
aiceo.net (Ex.2)
应该输出

asjewelries.com (Ex. 1)
aiceo.net (Ex. 2)

您可以使用以下正则表达式:

\w*[a-zA-Z]\w*\.\w{2,5}(?=\s)

我只想匹配/查找上层域(
asjewelries.com
aiceo.net

将“
域的
之后的所有内容匹配到第一个空格如何?这将缩小假阳性的范围

domain of (?:\S+\.)?([^ .]+\.[^ .]{2,5})
注意我是如何使用创建域的反向引用的。该模式中的所有其他内容都匹配除空格以外的任何字符,并使用“
”获取域

或者,如果文本“
域”不同,您可以简单地将其删除:

\s(?:\S+\.)?([^ .]+\.[^ .]{2,5})\s

重要的是,这两个域后面都有 在本例中为单词“
指定的特定单词(锚定)。
”。 他们可以立即被这个锚跟踪 或者在这两者之间可能有其他的词语

“指定”一词不会立即跟在域后面

简单,只需在模式中逐字匹配单词“
指定
”或“
指定
”即可

正则表达式: 重要提示:获取第一个反向引用(第一组)返回的文本。在AHK中,它应该由
匹配[1]
返回

输出:
如果您阅读几分钟有关正则表达式语法的内容,我相信您可以创建此类表达式,因此请允许我推荐:

  • 。一个相当全面的教程来学习正则表达式
  • 。允许您测试不同的表达式,并了解模式匹配Subset字符串的方式

  • 谢谢你的帮助。我忘了补充这些只是例子。在实际应用程序中,我不知道这些域是什么。我只知道它们的格式是xxx-xxx.xxx,xxx-xxx.yy,xxx.xxx,xxx.yy,等等。但我确实知道它们后面总是有一个锚词“指定”(可能是立即指定,也可能不是)。除了域名:.com、.net、.info、.tv等(点后跟1-4个字符)之外,所有长度都是未知的和可变的。感谢您的跟进。那么“asjewelries”和“aiceo”呢?它们仍然在代码中。我们不知道这些名字。这些只是例子。它们可以是任意名称(字符串)和任意长度。唯一已知的是锚词“designates”,它没有显示在代码中。我从这个站点获得的最接近的代码如下,但问题是首先它假设“designates”紧跟在域之后(如果中间有其他字符串,则不起作用),并且它也包含在匹配中。我如何从匹配中排除锚词“designates”,至少在以下代码中是这样的:RegExMatch(String,(?:\S++\S)?\S*designates,match)Pattern=Pattern.compile(“.+[\\.\124;\\ S](\\w+\.\\w{1,4})\\S+designates”);这一定是你要找的汉克斯的答案!我用AHK运行了你的代码,所以我不得不修改如下,但它从字符串的最开始一直返回到并包括“指定”:RegExMatch(字符串,“.+[\.\124;\ s](\w+\.\w{1,4})\s+指定”,match)哇!!!谢谢,karthik,它完全按照我的要求完成了任务。我用AHK脚本语言运行了您的代码,它完美地提供了精确的解决方案。它还解决了我的另一个问题,那就是你的代码不依赖于任何锚词,如“指定”等,正如我所想的那样!谢谢Mariano提供的有用提示和周到的建议。karthik manchala的解决方案\w*[a-zA-Z]\w*\.\w{2,5}(?=\s)成功了!我涉猎过AHK;不是铁杆黑客。我认为字符串应该有单词“
    指定”
    ”。该正则表达式不验证它。针对字符串“
    foo.com域忽略123作为允许的发送方”
    ”进行测试。。。至于语言,我这样问是因为每种正则表达式味道的答案可能会有所不同。AHK使用一个强大的库(PCRE)。是的,我非常绝望,不得不在字符串中使用锚词(在本例中为“指定”)才能到达任何地方。我有一个笨拙的三步解决方案,如下(LOL):(1)RegExMatch(String,“(?:\S+\S)?\S*\b designates\b”,match)(2)StringTrimRight,FoundDomain,match,11(3)RegExMatch(FoundDomain,“[^\.]+$”,FoundDomain)@Bruno所有的尝试都是有效的,重要的是你继续尝试。请记住,
    \w*[a-zA-Z]\w*.\w{2,5}(?=\s)
    也将匹配字符串“
    O123.45
    ”。另外,关于AHK和match[1]的使用,我有些熟悉,我看到的代码使用iO)(O代表对象)。我现在有一个(不是我的代码)正在使用match[1]来抓取域名:RegExMatch(字符串,“iO)\RFrom:[^\r\n]*[\w.%+-]+@((?:(?!sbcglobal)[A-Z\d.-])+\.[A-Z]{2,4},Found)>>结果:MsgBox,Found[1]
    \s(?:\S+\.)?([^ .]+\.[^ .]{2,5})\s
    
    domain of (?:\S+\.)?([^ .]+\.[^ .]{2,5}) .*?\bdesignates?\b
    
    "asjewelries.com"
    "aiceo.net"