2016-09-29 67 views
0

我有一个要求接受字符串值只有在符合下列条件:正则表达式公司名称变更

1)如果需要
2的特殊字符可以开始)必须以大写字母开头(即使第一字符是一个特殊字符)
3)字符串值必须没有连续(连续的)2个特殊字符
4)的字符串值不能有2位成一排(连续的)
5)重音字符是允许的(例如:Faddas)
6)封闭值st在结束的字符串的或本领域是有效的,但必须是在括号内(即:(LTD))
7)Numerics的在字符串值的任何地方允许

我有以下的正则表达式值:^(\(([^)]+)\))?[\@\#\$\%\&\*\(\)\-\_\+\]\[\'\;\:\?\.\,\!]?\p{Lu}+[\s'-]?\p{L}+(?:[\s'-]\p{L}+)+(\(([^)]+)\))*$

该工程确定了以下测试值:
东航运-LTD
东航运(LTD)

但失败了下面的例子:
Éast-123Shipping(LTD)

是否有任何方法允许数字中间字符串?
我尝试过[0-9]变化,[A-Za-z09]变化和p {N}变化,但无济于事。

非常感谢您的时间。

+1

请在此添加语言标签。 – revo

回答

2

这是一个真的讨厌的模式,但我能够把它简化一下,你想要的东西:

^(\(([^)]+)\))?[[:punct:]]?\p{Lu}+(?:[\s'-]?[\p{L}\d]+)+(\(([^)]+)\))*$ 

有许多有用的速记字符类,包括[[:punct:]],我用它取代你的大量标点字符类。为了增加包含数字的能力,我把\p{L}放在一个带有\d标记的字符类中,该标记将匹配任何数字(任何语言和Unicode标记)。

Demo on Regex101