法语名称的Java正则表达式

时间:2017-09-06 11:23:57

标签: java regex

我需要修改正则表达式以允许所有标准字符,法语字符,空格和破折号(连字符),但一次只允许一个。

我现在拥有的是:

import java.util.regex.Pattern;

public class FrenchRegEx {

    static final String NAME_PATTERN = "[\u00C0-\u017Fa-zA-Z-' ]+";

    public static void main(String[] args) {

        String name;

        //name = "Jean Luc"; // allowed
        //name = "Jean-Luc"; // allowed
        //name = "Jean-Luc-Marie"; // allowed
        name = "Jean--Luc"; // NOT allowed

        if (!Pattern.matches(NAME_PATTERN, name)) {
            System.out.println("ERROR!");
        } else System.out.println("OK!");
    }
}

它允许'让 - 吕克'作为名字,这是不允许的。

对此有何帮助? 感谢。

3 个答案:

答案 0 :(得分:8)

因此,您需要一个0或更多连字符的模式,由1个或多个其他字符分隔。这只是编写模式的问题:

"[\u00C0-\u017Fa-zA-Z']+([- ][\u00C0-\u017Fa-zA-Z']+)*"

这也假设您不希望名称以连字符或空格开头或结尾,也不希望一行中有多个空格,并且您还希望禁止使用空格或继续连字符。

答案 1 :(得分:4)

您需要禁止连续连字符。你可以用负面的前瞻来做这件事:

static final String NAME_PATTERN = "(?!.*--)[\u00C0-\u017Fa-zA-Z-' ]+";
                                    ^^^^^^^^

要禁止任何特殊字符连续,请使用

static final String NAME_PATTERN = "(?!.*([-' ])\\1)[\u00C0-\u017Fa-zA-Z-' ]+";

另一种方法是将模式展开一点以匹配字符串,其中特殊字符可以出现在字母之间,但不能连续出现(即如果你需要匹配Abc-def'here字符串):

static final String NAME_PATTERN = "[\u00C0-\u017Fa-zA-Z]+(?:[-' ][\u00C0-\u017Fa-zA-Z]+)*";

或仅允许1个特殊字符只能出现在字母之间(例如,如果您只允许使用abc-defabc'def等字符串):

static final String NAME_PATTERN = "[\u00C0-\u017Fa-zA-Z]+(?:[-' ][\u00C0-\u017Fa-zA-Z]+)?";

请注意,此处不需要锚点,因为您在.matches()方法中使用了需要完整字符串匹配的模式。

注意:您可以通过移动可能出现在字符串中任何位置的特殊字符来进一步调整模式,从[-' ]字符类到[\u00C0-\u017Fa-zA-Z]字符类,如[\u00C0-\u017Fa-zA-Z],但请注意出去-。它应放在]附近的末尾。

答案 2 :(得分:2)

尝试使用([\u00C0-\u017Fa-zA-Z']+[- ]?)+。这将匹配由一个短划线或空格分隔的一个或多个名称。