2017-09-06 81 views
2

我需要修改正則表達式以允許所有標準字符,法語字符,空格和短劃線(連字符),但一次只能有一個。法語名稱的Java正則表達式

我有現在的問題是:

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!"); 
    } 
} 

,它允許「讓 - 呂克」作爲名稱,這是不允許的。

對此有何幫助? 謝謝。

+1

''\ u00C0- \ u017Fa-zA-Z]([ - '] [\ u00C0- \ u017Fa-zA-Z])'' – Lothar

+1

'\ u00C0- \ u017F'範圍內的大部分字母aren不會用法語。 –

+2

強制鏈接:[Falsehoods Programmers Believe About Names](http://www.kalzumeus.com/2010/06/17/falsehoods-programmers-believe-about-names/)。 –

回答

7

所以,你想要一個由0或更多連字符組成的模式,由1個或多個其他字符分隔。這只是一個寫的模式這樣的事情:

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

這還假定你不想名稱啓動或連字號或空格結束,也不是說要在連續多個空間,你也想禁止空格跟隨或繼續連字符。

+1

我會將撇號移動到不應出現在一起的符號列表。我懷疑OP是否想要匹配'De's'或者'Bob'Ray'。對我而言,唯一可疑的情況是名稱末尾的撇號在某些情況下可能有效。 –

4

您需要禁止連續的連字符。你可能會負先行做到這一點:

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

要禁止任何特殊字符的是連續的,使用

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

另一種方法是展開的模式有點匹配字符串凡特

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

,或者只允許1個特殊字符日:(如果你需要匹配Abc-def'here像串即)字符(S)可以出現在字母之間,但不能連續出現at只能出現在字母之間(即如果你孃家,只允許串像abc-def,或abc'def):

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

注意,你千萬不要因爲你使用的是.matches()方法,需要一個完整的字符串匹配的內部格局這裏需要錨。

注意:您可以進一步微調,通過移動可以從[-' ]字符類的[\u00C0-\u017Fa-zA-Z]字符類,像[\u00C0-\u017Fa-zA-Z]在字符串中的任何地方出現特殊字符的模式,但要注意-。它應該放在最後,靠近]

2

嘗試使用([\u00C0-\u017Fa-zA-Z']+[- ]?)+。這將匹配由一個短劃線或空格分隔的一個或多個名稱。

+0

注意'([\ u00C0- \ u017Fa-zA-Z'] + [ - ]?)+'也允許在字符串末尾有一個'-'或空格。 –

+0

@WiktorStribiżew:答案中的兩個第一模式也允許它。 –

+0

是的,我只是注意到了。 –