Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net Regex检查'-';或'+';都在起点和终点_.net_Regex - Fatal编程技术网

.net Regex检查'-';或'+';都在起点和终点

.net Regex检查'-';或'+';都在起点和终点,.net,regex,.net,Regex,我正在尝试创建一个正则表达式,它可以检查字符串是否与模式匹配-*0001- 字符串的第一个字符或最后一个字符可以是+或-。在字符串的开头有一个可选的*(在+或-之后),之后,我们不允许使用特殊字符。除了+、-和可选的*之外,至少需要有一个字符 正确的匹配应该是 -cccc cccc- +ccccc ccccc+ +*cccc *cccc+ 一个不正确的匹配是错误的 -cc*c *- + +- 到目前为止,我的正则表达式非常接近,但还不够接近: ^([\+\-]?)(\*?)([a-z0-9]*)

我正在尝试创建一个正则表达式,它可以检查字符串是否与模式匹配
-*0001-

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

正确的匹配应该是

  • -cccc
  • cccc-
  • +ccccc
  • ccccc+
  • +*cccc
  • *cccc+
  • 一个不正确的匹配是错误的

  • -cc*c
  • *-
  • +
  • +-
  • 到目前为止,我的正则表达式非常接近,但还不够接近:

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

    也许简单点,像这样

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

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

    这与
    -ccc
    +ccc
    ccc-
    +ccc++
    -ccc++
    ++++
    ++
    ++
    ,但不是
    ++
    ,也不是
    +\t

    如果第一个字符是
    +
    -
    ,则不允许最后一个字符是
    +
    -
    ,反之亦然(字符串不以
    +
    -
    开头和结尾),您需要执行以下操作:

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

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

    要不匹配类内部的任何
    +
    -
    ,您需要执行以下操作

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

    +++++a


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

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

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


    还有什么你没有告诉我们的吗?

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

    ^([-+]).+\1$
    
    这将匹配一个-或+字符的
    [-+]
    (-首先,它不被视为一个范围),然后是一些字符,然后是第一组字符。第一组是第一个字符,因为我们把它放在括号里

    例如:

    $ echo '-aaaa-' | grep -P '^([-+]).+\1$'
    -aaaa-
    

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

    最后的答案是

    ^((?[+-])(?\*?)(?\w+)(?\*?)(?\w+)(?\w+([+-])(?\*?)(?\w+)$


    这考虑了可选(+-)可选(*)(字符)可选(+-)

    关于
    ccccc
    -ccccc-
    ,或
    +ccccc-
    ,真正的要求是什么?它必须以+或-开头或结尾,中间可以有任何字符,也可以没有字符?因此,以下内容将匹配:
    +
    -
    +-
    那么
    +
    -
    +
    -
    +\t
    -\n
    呢?顺便说一下,您发布的正则表达式非常复杂。。。它到底想传达什么?我不确定它是否像你想的那么接近-它匹配像
    “+*523-+-”
    。@Kobi我用了你的答案谢谢,我稍微修改了一下,因为我在发帖后注意到我忘了提什么
    ?([+-]\*?\w+\*?\w++-]\*?\w+[+-]\*?\w+$
    为什么?还有什么?编辑您的问题以指定比标题包含的要求更多的要求。这个正则表达式匹配所有的测试用例。也许给出一些不匹配输入的例子,你有没有费心去看看它应该是什么match@Enzero在这种情况下,你的问题不够清楚。你说“例如”-*0001-,但您没有说它应该精确匹配什么。已编辑:此正则表达式现在匹配您的所有测试用例。你没有指定一个最小/最大朗斯,或者什么字符可能出现在中间。也许可以给出一些不匹配输入的例子。我想他正在尝试进行部分字符串匹配,但还没有告诉我们。你的答案在.Net中不起作用,只是在regex中尝试了一下。你的regex依赖于特定的regex引擎。我知道许多引擎不将第一个
    ]
    视为集合的结尾,因为
    -
    。如果要禁止除首字母
    *
    以外的特殊字符,请使用
    \w
    而不是
    \s