我需要通过正则表达式

时间:2019-01-06 20:05:39

标签: java regex

晚上好。 我有一个字符串,例如“ leichtbewölktleichter Regen Regen”。我需要一个正则表达式模式来匹配“ leichtbewölkt”(两个形容词),“ leichter Regen”(形容词和名词)和“ Regen”(名词)。我发现如何匹配形容词“ \ b [a-z] [a-z] * \ b”,但是我该如何使用两个形容词或一个形容词和一个名词...呢?我有点迷路了。 提前致谢。

\ b [a-z] [a-z] * \ b

1 个答案:

答案 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 characterunless 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);

regex101java code on ideone