如何使用正则表达式匹配不以某些字符开头或结尾的单词?
Posted
技术标签:
【中文标题】如何使用正则表达式匹配不以某些字符开头或结尾的单词?【英文标题】:How to match words that doesn't start nor end with certain characters using Regex? 【发布时间】:2020-02-06 05:18:22 【问题描述】:我想查找不以某些特定字符开头或结尾的单词匹配。 例如,我有这个输入,我只想匹配突出显示的单词:
"字符串" 字符串 '字符串'
并排除其他以 " 或 ' 开头和结尾的单词。
我目前正在使用这种模式:
但我不知道应该使用什么模式来排除以某些指定字符开头和结尾的单词。
有人可以就我应该使用什么模式给我一些建议吗?谢谢
【问题讨论】:
(?<!")\bstring\b(?!")
效果很好,谢谢!
(?
@siggi_pop 你是对的,疏忽——在我的回答中解决了。
排除哪些词?英语单词?正则表达式无法匹配语言单词。
【参考方案1】:
您当前使用的模式匹配自\b
正确断言"s
和g"
之间的位置(单词字符[a-zA-Z0-9_]
和非单词字符之间的位置)。您可以使用以下方法之一:
-
否定特定字符(否定后向/前瞻)
此方法允许您指定要从匹配中求反的字符、字符集或子字符串。
(?<!['"])\bstring\b(?!['"])
- see it in use here
(?<!['"])
- 确保 "
不在前面。
(?!['"])
- 确保 "
不会继续。
允许特定字符(正向后视/前瞻)
此方法允许您指定字符、字符集或子字符串以确保匹配。
(?<=\s|^)\bstring\b(?=\s|$)
- see it in use here
(?<=\s|^)
- 确保空格或行首在前面。
(?=\s|$)
- 确保空格或行尾继续。
以上两者的组合
此方法允许您否定特定情况,同时允许其他情况(不常用,也不是所提出的问题真正需要的,但可能对您或其他人有用。
(?<=\s|^)string(?!\s+(?!stop)|$)
之类的东西可以确保单词后面不跟 stop
(?<=(?<!stop\s*)\s+|^)string(?=\s+|$)
之类的东西可以确保单词不跟在单词 stop
之后 - 请注意,大多数正则表达式引擎都不允许在后视中使用量词 (\s+
),.NET 允许这样做。
(?<=\s|^)\bstring\b(?=\s|$)(?!\z)
之类的内容可以确保单词不在字符串末尾(如果是多行则与行尾不同)。
【讨论】:
@CasimiretHippolyte 感谢您的关注 - 现在已修复。【参考方案2】:如果它在空格之间,这个正则表达式将选择 string:\sstring\s
var sample = "\"string\" string \"string\" astring 'string_ string?string string ";
var regx = new Regex(@"\sstring\s");
var matches = regx.Matches(sample);
foreach (Match mt in matches)
Console.WriteLine($"mt.Value mt.Index,3 mt.Length,3");
【讨论】:
虽然这并不能真正回答问题,基本上是如何找到所有未包含在"
或 '
中的内容。 OP没有说例如不应该找到astring
。没有前导或尾随空格的字符串开头或结尾的单词也会在此处被排除以上是关于如何使用正则表达式匹配不以某些字符开头或结尾的单词?的主要内容,如果未能解决你的问题,请参考以下文章