我正在尝试创建一个正则表达式,可以检查字符串是否匹配模式-*0001-
字符串的第一个字符或最后一个字符可以是+
或-
。字符串开头有一个可选的*
(+
或-
之后),之后我们禁止使用特殊字符。除了+
,-
和可选*
之外,至少需要一个字符。
正确的匹配是
-cccccc
cccccc-
+ccccc
ccccc+
+*cccc
*cccc+
不正确的匹配将是
-cc*c
*-
+
+-
我到目前为止的正则表达式非常接近但不够接近:
^([\+\-]?)(\*?)([a-z0-9]*)([\+\-]?)(\1\4)$
答案 0 :(得分:1)
也许更简单,像这样?
正则表达式1: ([+-]\S+)|(\S+[+-])
这将匹配以+
,-
开头或以+
,-
(或两者)结尾的任何字符串。
它不会检查只有一个+
或-
,并且它本身或与任何空格不匹配+
或-
。
匹配-ccc
,+ccc
,ccc-
,ccc+
,+ccc+
,-ccc+
,+++++
,{{1 }},但不是++
而不是+
如果第一个字符为+\t\t
或+
,则不允许最后一个字符为-
或+
,反之亦然(字符串不会同时启动和以-
或+
结束,你想做的事情
正则表达式2: -
这与([+-]\S*[^+\-\s])|([^+\-\s]\S*[+-])
或-ccc+
或++
不匹配,但与+++++
匹配。
要与班级内部的任何+++++a
或+
不匹配,您需要
正则表达式3: -
哪个与([+-][^+\-\s]+)|([^+\-\s]+[+-])
不匹配
修改:忘记转义字符类中的++++a
。
答案 1 :(得分:0)
我不知道为什么你的尝试或其他答案如此复杂。
这将执行标题要求:^([+-].*|.*[+-])$
还有更多你没有告诉我们的事吗?
答案 2 :(得分:0)
我认为当第一个和最后一个位置具有相同的字符时,OP想要匹配,这可以是 - 或+,例如-aaa-
或+aaa+
但不是-aaa+
。在这种情况下,这应该工作:
^([-+]).+\1$
这匹配[-+]
为 - 或+字符( - 首先,因此它不被视为范围),然后是一些字符,然后是第一组。第一组是第一个字符,因为我们把它放在括号中。
示例:
$ echo '-aaaa-' | grep -P '^([-+]).+\1$'
-aaaa-
答案 3 :(得分:0)
归功于Kobi,但出于某种原因,他已经取消了答案。我已经编辑了一下
最终答案是
^(?:(?<UOMPrefix>[+-])(?<BCPrefix>\*?)(?<BarCode>\w+)|(?<BCPrefix>\*?)(?<BarCode>\w+)(?<UOMPrefix>[+-])|(?<BCPrefix>\*?)(?<BarCode>\w+))$
这考虑了可选(+ - )可选(*)(字符)可选(+ - )