晚上好。 我有一个字符串,例如“ leichtbewölktleichter Regen Regen”。我需要一个正则表达式模式来匹配“ leichtbewölkt”(两个形容词),“ leichter Regen”(形容词和名词)和“ Regen”(名词)。我发现如何匹配形容词“ \ b [a-z] [a-z] * \ b”,但是我该如何使用两个形容词或一个形容词和一个名词...呢?我有点迷路了。 提前致谢。
\ b [a-z] [a-z] * \ b
答案 0 :(得分:1)
从您当前的正则表达式很容易派生一个匹配以大写字母开头的单个完整单词的正则表达式,只需将第一个字符类替换为其大写字母即可:
\b[A-Z][a-z]*\b
现在我们只需要结合两者即可匹配以下模式:
我们可以通过将单个单词与单个空格字符相连来表示连续单词。
一个基本的解决方案是上述三种模式的替代:
\b[a-z][a-z]*\b \b[a-z][a-z]*\b|\b[a-z][a-z]*\b \b[A-Z][a-z]*\b|\b[A-Z][a-z]*\b
^________two adjectives_______^ ^____one adjective one noun___^ ^__one noun__^
可以通过多种方式进行改进:
\b[a-z]+\b
(+
是“一个或多个”,等于一个,然后是“ 0或多个” *
)[a-z]
字符和空格之间会自动存在一个单词边界,因此,可以删除单词之后和空格之前的\b
,以及空格之后和单词之前的\b[a-z]+ [a-z]+\b|\b[a-z]+ [A-Z][a-z]*\b|\b[A-Z][a-z]*\b
如果单词和空格匹配,它们总是会匹配的。最后,我将使用以下内容:
\p{Ll}
Testing it on regex101显示非ASCII字符(ö
isn't matched by [a-z]
and isn't considered a word character,unless the UNICODE flag is set)的问题。
要处理unicode问题,可以将\p{Lu}
“任何语言的小写字母”和\b
“任何语言的大写字母”元字符与UNICODE标志/ UNICODE_CHARACTER_CLASS for Java结合使用(需要\b\p{Ll}+ \p{Ll}+\b|\b\p{Ll}+ \p{Lu}\p{L}*\b|\b\p{Lu}\p{Ll}*\b
才能正常工作),而不是您当前的字符类:
Intent intent = new
Intent(android.content.Intent.ACTION_VIEW,
Uri.parse("http://maps.google.com/maps?daddr="destination address text"));
startActivity(intent);