正则表达式:我如何匹配可能有短划线的姓氏,但如果它有短划线,则它只能包含1

时间:2015-12-09 20:23:37

标签: java regex

标题说明了一切,但我会提供一个例子。

ex. "Fred Hendricks" True
ex. "Casey Vegies-fish" True
ex. "Casey Veg-ie-s" False

这是我到目前为止所做的:

^(((Mr.\s)|(Mrs.\s)|(Ms.\s)|(Dr.\s)|(Hon.\s)|(Prof.\s))?[a-zA-Z]+)\s(([A-Z][.][ ]))?([a-zA-Z]+((\sJr.)|(\sPh.D.)|(\sM.D.)|(\sII)|(\sIII)|(\sIV))?)$

2 个答案:

答案 0 :(得分:1)

在某种情况下,您必须同时强制执行边界 允许单词破折号,但中间不超过2个破折号。

为了做到这一点,你必须强制破折号不符合资格 开头或结尾的单词边界 而在同一时间,允许它在中间。

注意 - 您可以使用空白边界而不是单词边界 (?<!\S) .. (?!\S)。代替(?<!-)\b .. \b(?!-)
这是更好的选择。

(?<!-)\b(?!(?:[^\W-]*-){2})\w(?:-?\w)*\b(?!-)

格式化:

 (?<! - )
 \b                            # Word boundary, but not a dash behind
 (?!                           # Not 2 or more dashes in this word
      (?: [^\W-]* - ){2}
 )
 \w                            # Starts with a word char
 (?:                           # Optional many dash then word char
      -?     
      \w 
 )*
 \b                            # Word boundary, but not a dash ahead
 (?! - )

答案 1 :(得分:1)

表达式中与姓氏匹配的部分是[a-zA-Z]+。您可以使用量词[a-zA-Z]+(-[a-zA-Z]+)?(一次或根本不更改)将其更改为?来调整它以接受一个短划线。