使用正则表达式确定逗号分隔值是否有效

时间:2016-04-13 00:19:01

标签: java regex pattern-matching regex-negation regex-lookarounds

我有一个逗号分隔的字母数字值的字符串。如果它们的长度恰好为2个字符,并且它们至少有1个字母字符,则认为这些值有效。如果所有值都有效,那么我想“捕获”整个字符串,包括逗号。如果缺少值(背对背逗号),则整个字符串无效。我只能使用正则表达式。空格被忽略,使用的编程语言是Java

实施例

  • “3F,4B,AA,A4B” - 未捕获,因为'A4B'长度为3
  • “3F,4B,55,A4” - 未捕获,因为'55'没有至少1 按字母排序的字母
  • “3F,4B ,,” - 未捕获,因为缺少第2和第3之间的值 逗号
  • “3F,4B,AA,A” - 未捕获,因为'A'值是长度1
  • “3F,4B,AA,” - 捕获(允许尾随逗号)

4 个答案:

答案 0 :(得分:2)

我只想使用以下表达式强行推迟这个

\d[A-Z]|[A-Z]{2}|[A-Z]\d
    - \d[A-Z] - digit followed by uppercase A-Z characters
    - [A-Z]{2} - 2 uppercase A-Z characters
    - [A-Z]\d - uppercase A-Z character followed by a digit

下面是故障:

在你的情况下,2个字符有3个特殊情况,它们是有效的

(                               - start group
    (\d[A-Z]|[A-Z]{2}|[A-Z]\d)  - group as explained above
    ,\s                         - followed by comma and space
)*                              - entire group 0 or more times

然后使用它作为基础我做了一个表达式,表示我需要一组逗号后跟逗号和空格0次或更多次

(                               - start group
     \d[A-Z]|[A-Z]{2}|[A-Z]\d   - group as explained above
)                               - end group
,?                              - 0 or 1 trailing comma
$                               - match end of line

然后我用相同的表达式跟着它,但添加了一些额外的修饰符

String expression = "((\\d[A-Z]|[A-Z]{2}|[A-Z]\\d),\\s)*(\\d[A-Z]|[A-Z]{2}|[A-Z]\\d),?$";

System.out.println("3F, 4B, AA, A4B".matches(expression)); // false
System.out.println("3F, 4B, 55, A4".matches(expression)); // false
System.out.println("3F, 4B, 5A, A4".matches(expression)); // true
System.out.println("3F, 4B,,".matches(expression)); // false
System.out.println("3F, 4B, AA, A".matches(expression)); // false
System.out.println("3F, 4B, AA,".matches(expression)); // true

Theres可能是一种更优雅的表达方式,但这种方式看起来非常简单。下面是一些使用它的Java示例。

<powco-interface name="form" data="{{data}}"></powco-interface>

Theres有很多非常好的网站,可让您在浏览器中测试正则表达式并立即获得反馈。这是构建和测试正则表达式的好方法,很多时候甚至在页面上有一个很好的解释,告诉你你写的表达式。

尽管这些网站中有许多不提供用于表达式评估的Java环境,但大多数语言对于正则表达式具有相同或非常接近相同的规范。为了构建这个表达式,我在Javascript中测试它,然后在java中运行它以确保它有效。下面是保存表达式的链接,以便您自己测试https://regex101.com/r/uP4oY2/1

答案 1 :(得分:2)

首先,您可以将有效格式简化为[Alpha + Digit] [Alpha]或[Alpha] [Alpha + Digit]:

String regex = "[a-zA-Z][a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z]"

然后你想在它周围允许任意数量的空格:

String regex = "\\s*([a-zA-Z][a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z])\\s*"  

你希望它后面跟一个逗号,除非它是字符串的结尾:

String regex = "\\s*([a-zA-Z][a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z])\\s*(,|$)"  

这种模式可以重复任意次数(一次或多次):

String regex = "(\\s*([a-zA-Z][a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z])\\s*(,|$))+"  

答案 2 :(得分:1)

好的,所以想法是将三个组连接起来或

(Alpha Digit or Digit Alpha or Alpha Alpha)

然后我们将允许末尾的空格

whitespace zero or more (Alpha Digit or Digit Alpha or Alpha Alpha) whitespace zero or more

最后,我们将用逗号重复这4次。

答案 3 :(得分:1)

您可以尝试使用正则表达式:

var doughnutData = [
                   {
                      value: somevar,
                      label: 'My Caption',
                      color: '#811BD6'
                   },{
                  value: 20,
                  label: 'cap 2',
                  color: '#D18177'
               },
               {
                  value : 40,
                  label: 'cap 3',
                  color: '#6AE128'
               },
];

这个正则表达式可以在java中用作

^((\s+)??(\d[a-z]|[a-z]\d|[a-z]{2}),?)+?$

测试用例:

boolean foundMatch = text.matches("(?ismd)^((\\s+)??(\\d[a-z]|[a-z]\\d|[a-z]{2}),?)+?$");