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"