java正则表达式排除列表模式

时间:2011-11-09 22:51:18

标签: java regex

我明白当我做[^ abc]时,这将匹配a,b和c以外的任何东西。如果我希望它匹配除“......”之外的任何内容,该怎么办?到目前为止,我的排除清单是:

[^<>?:\“/ \ | *] +

我想在此排除列表中添加“..”。所以在英语中它将是“如果除了左括号,右括号,双引号,asterix,双点(”..“)之外的其他任何字符,其余字符在这里,那么它应该匹配”。

我需要传递的测试用例是:

foo/../baz needs to be /baz
bar/../../foo needs to be /../foo

5 个答案:

答案 0 :(得分:0)

不是Java专家,但看起来你在那里定义了一个否定的字符类。字符类基本上是该类中的字符列表,或者在您的情况下,不在该类中,您可以将其应用于字符串。

看起来你最有可能在匹配字符串“..”之后。如果是这样,我认为你只需要一个特定的正则表达式。也许这会成功:

\.\.

点“。”当然,它本身匹配任何单个字符,因此需要反斜杠转义来匹配两个点的实际字符串而不是任何两个字符。

答案 1 :(得分:0)

如果java可以做前瞻性断言,可以这样做:

(?:(?!\.\.)[^<>:"/|?*])+未经测试

修改以上内容将匹配到第一个.. 不清楚你要做什么,但要将整个字符串验证到这些条件,只需添加^$ -
^(?:(?!\.\.)[^<>:"/|?*])+$未经测试

答案 2 :(得分:0)

好的我已经玩了一会儿,如果..字符串存在,这将阻止匹配:

^(?:(?!(\.\.)).)*$

我要继续,但你可以考虑简单地运行两个单独的正则表达式,并确保两者都不匹配。

答案 3 :(得分:0)

如果您对分隔符本身不是特别感兴趣,可以使用此

    String source = "aa^bb<cc>dd:ee\"ff/gg\\hh|ii?jj*kk:ll/mm..mn";
    String regex = "[<>:\"/\\\\|?*^]+|[.]{2}";
    String[] splits = source.split(regex);
    System.out.println(Arrays.toString(splits));

输出

[aa, bb, cc, dd, ee, ff, gg, hh, ii, jj, kk, ll, mm, mn]

答案 4 :(得分:0)

@xonegirlz - 排除..的方法取决于您要做的事情。您的“测试用例我需要传递”是一些帮助,但“需要”的陈述含糊不清。

如果您能说出

,那会很有帮助
"I'm writing a function X that, given a String like Y,
would return a String like Z.
I'm trying to use a regex-replace to find ______ in Y
and replace all execpt _______ to return Z".

你当前的问题只是询问否定的字符类,答案是你不能这样做(“......”)