首页 > 解决方案 > 在java中排除一定长度的单词的负向Lookbehind

问题描述

我有一个正则表达式

\p{L}+[\s,،]*(خیابان)?[\s,،]*\p{L}+[\s,،]*(کوچه|کوی)?[\s,،]*\p{L}+[\s,،]*(پلاک \s*\d+)?(\s*کد پستی \s*\d{9})?

此 Regex 匹配长度为 3 或更多的任何拉丁字符。与 ABC 一样,匹配大于 3 的 ABCDE。

我想要的是,这个正则表达式仅在拉丁字符大于 6 的情况下匹配(假设)。我不想更改上面的正则表达式,但只想排除小于 6 的拉丁字符匹配。

所以我添加了 Negitive Lookbehind 作为

(?<!\w{1,6})

现在正则表达式变为

\p{L}+[\s,،]*(خیابان)?[\s,،]*\p{L}+[\s,،]*(کوچه|کوی)?[\s,،]*\p{L}+[\s,،]*(پلاک \s*\d+)?(\s*کد پستی \s*\d{9})?(?<!\w{1,6})

但这里所有长度的拉丁字符都被排除在外。

如何添加负向后查找以排除长度 {1 到 6} 内的拉丁字符?

标签: javaregexnegative-lookbehind

解决方案


您的正则表达式失败,因为负面的后视仅检查字符串末尾的 1-6 个单词。

例如,字符串“A BCDEFG ”有 7 个字符,而您的否定后看发现“ BCDEFG ”是 6 个字符,然后排除所有字符串。

我认为你应该像这样修复负面的lookbehind:

(?<!^\w{1,6})

注意“^”,这意味着你的lookbehind必须从一开始就检查。


推荐阅读