-1

我正在尝试制作一个可以检查字符串是否与模式匹配的正则表达式-*0001-

字符串的第一个字符或最后一个字符可以是 a+或 a -*在字符串的开头有一个可选字符(在+or之后-),之后我们禁止使用特殊字符。除了, 和 optional之外+,至少需要有一个字符。-*

正确的匹配是

  1. -cccccc
  2. cccccc-
  3. +ccccc
  4. ccccc+
  5. +*cccc
  6. *cccc+

不正确的匹配将是

  1. -cc*c
  2. *-
  3. +
  4. +-

到目前为止,我的正则表达式非常接近,但还不够接近:

^([\+\-]?)(\*?)([a-z0-9]*)([\+\-]?)(\1\4)$
4

4 回答 4

1

也许更简单的东西,像这样?

正则表达式 1: ([+-]\S+)|(\S+[+-])

这将匹配任何以 , 开头+-+,结尾-(或两者兼有)的字符串。它不会检查是否只有一个+or -,并且它不匹配+or-本身或任何空格。

这匹配-ccc, +ccc, ccc-, ccc+, +ccc+, -ccc+, +++++, ++, 但不+匹配+\t\t

不允许最后一个字符是+或者-如果第一个字符是+or -,反之亦然(字符串不是以+or开头和结尾-),你想做类似的事情

正则表达式 2: ([+-]\S*[^+\-\s])|([^+\-\s]\S*[+-])

这不匹配-ccc++++++++但匹配+++++a

为了不匹配任何+-在你的班级内部,你需要做

正则表达式 3: ([+-][^+\-\s]+)|([^+\-\s]+[+-])

哪个不匹配++++a

编辑:忘记-在字符类中转义。

于 2012-06-20T12:45:07.037 回答
0

我不知道为什么您的尝试或其他答案如此复杂。

这将满足标题的要求: ^([+-].*|.*[+-])$

还有更多你没有告诉我们的吗?

于 2012-06-20T13:02:08.597 回答
0

我认为当第一个和最后一个位置都具有相同的字符时,OP 希望匹配,可以是 - 或 +,例如-aaa-or+aaa+但不是-aaa+。在这种情况下,这应该有效:

^([-+]).+\1$

这匹配[-+]一个 - 或 + 字符(首先是 - 所以它不被视为一个范围),然后是一些字符,然后是第一组。第一组是第一个字符,因为我们把它放在括号中。

例子:

$ echo '-aaaa-' | grep -P '^([-+]).+\1$'
-aaaa-
于 2012-06-20T13:09:05.453 回答
0

功劳应该归功于科比,但由于某种原因,他删除了他的答案。我已经编辑了一点

最后的答案是

^(?:(?<UOMPrefix>[+-])(?<BCPrefix>\*?)(?<BarCode>\w+)|(?<BCPrefix>\*?)(?<BarCode>\w+)(?<UOMPrefix>[+-])|(?<BCPrefix>\*?)(?<BarCode>\w+))$

这考虑了 Optional(+-)Optional(*)(characters)Optional(+-)

于 2012-06-20T13:19:23.787 回答