我正在努力解决这个正则表达式难题,但这超出了我的专业知识...
我有这样的字符串:
字符串1:
$arr = [array]1
$arr.gettype().fullname
System.Object[]
([System.Object[]] | Get-Member -Static).where{$_.name -eq "ToString"}
$arr.toString()
System.Object[]
字符串2
Interface123|HostVienna ~ Tunnel22 ~ CustomerA ~ ServiceA ~ Vienna, Street 10|HostAmsterdam ~ Interface123 ~ CustomerB ~ ServiceA ~ Amsterdam, Street 40|HostSarajevo ~ Interface12 ~ CustomerC ~ ServiceA ~ Sarajevo, Street 1040
我正在尝试制作一个可以匹配从字符串开头到“ |”的所有内容的正则表达式(单词)并使用该匹配项,我试图找到以“ |”分隔的字符串包含那个词。在我的示例中,单词是Interface123|HostAmsterdam ~ Interface123 ~ CustomerB ~ ServiceA ~ Amsterdam,Street 40
。
从以上任一示例中,结果应为:
Interface123
使用纯正则表达式可能吗?
答案 0 :(得分:1)
这可以通过regexp back引用实现,尽管并非每个实现都支持它们。像这样:
^([^|]+)\|(?:[^|]*\|)*?([^|]*\1[^|]*)
第二小组将捕获您的需求。
说明:^([^|]+)\|
捕获您的关键字,(?:[^|]*\|)*?
匹配零个或多个被'|'
包围而没有关键字的字符串,([^|]*\1[^|]*)
匹配您最终需要的内容。
答案 1 :(得分:1)
/^([^|]+)\|(?:[^|]+\|)*?\K[^|]*\b\1\b[^|]*/
在搜索下一个出现的位置时,重要的是要捕获它的针并最少使用字边界。
此外,将匹配作为字符串中的第一个,中间或最后一个数据集也很重要。这就是(?:[^|]+\|)*?
演示:https://regex101.com/r/7lMwZf/5
故障:
^ # start of string
([^|]+)\| # capture needle then match first delimiting pipe
(?:[^|]+\|)*? # match zero or more "sets of data"
\K[^|]*\b\1\b[^|]* # forget previously matched characters with \K, then match set of data containing the needle until the end of string or first encountered pipe
答案 2 :(得分:0)
这是一个似乎有效的模式:
(?<=\||^)((?:(?!\|).)*Interface123.*?)(?=\||$)
这使用钢化的点来匹配所需的包含Interface123
的字符串段。这是一个简短的解释:
(?<=\||^) assert that what is prior is either pipe or the start of the string
((?:(?!\|).)* consume anything so long is it is NOT pipe
Interface123.*? match 'Interface123` followed by anything up to
(?=\||$) assert that what follows is either pipe or the end of the string
此答案使用环顾四周,但是根据您的评论,您的正则表达式风格与Perl兼容,这应该不是问题。