tenderuser
tenderuser
2012-01-09 23:03

这个正则中的具体意思

已采纳

[code="java"]
System.out.println(StringUtils.join("0098765424100304643528".split("(?<=\G.{4})"), "->"));
[/code]

上面的是一个正则 , 主要是把字符串按四个分割, 中间插入-> , 现在我想请教一下, 这里面的\G究竟是干什么的呢? 求指导

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答

4条回答

  • oxcow oxcow 9年前

    [quote] 这里我有个疑问, 我们有在jdk中的pattern类的说明中找到\G的解释。。。 请问两位是在什么地方找到的?还有对于正则表达式的jdk的解释引擎和prel的及其他语言的解释引擎有什么具体的区别呢?正则表达式是不是不只是看懂那些仅有的几个符号表达的意思就可以了。。。 [/quote]

    1、你有java的帮助文档没?没有的话下一个java中文帮助文档。上哦所里面的pattern类继就可以看到[quote]Unicode 块和类别的类
    \p{InGreek} Greek 块(简单块)中的字符
    \p{Lu} 大写字母(简单类别)
    \p{Sc} 货币符号
    \P{InGreek} 所有字符,Greek 块中的除外(否定)
    [\p{L}&&[^\p{Lu}]] 所有字母,大写字母除外(减去)

    边界匹配器
    ^ 行的开头
    $ 行的结尾
    \b 单词边界
    \B 非单词边界
    \A 输入的开头
    \G 上一个匹配的结尾
    \Z 输入的结尾,仅用于最后的结束符(如果有的话)
    \z 输入的结尾

    Greedy 数量词
    X? X,一次或一次也没有
    X* X,零次或多次
    X+ X,一次或多次
    X{n} X,恰好 n 次
    X{n,} X,至少 n 次
    X{n,m} X,至少 n 次,但是不超过 m 次

    Reluctant 数量词
    X?? X,一次或一次也没有
    X*? X,零次或多次
    X+? X,一次或多次
    X{n}? X,恰好 n 次
    X{n,}? X,至少 n 次
    X{n,m}? X,至少 n 次,但是不超过 m 次
    [/quote]
    2、至于跟perl的引擎有什么区别,呵呵,这个不是一两句话就能讲明白的。因为这个正则表达式在各个语言中的是不尽相同的。如果你想了解下的话,给你推荐一本书《精通正则表达式》,当当的地址是[url]http://product.dangdang.com/product.aspx?product_id=20653863[/url]。这本书写的相当不错。你可以参考下。目前我正在读,呵呵!

    希望对你有帮助!

    点赞 评论 复制链接分享
  • iteye_16709 iteye_16709 9年前

    楼上补充的很好!顶一个 :D

    点赞 评论 复制链接分享
  • oxcow oxcow 9年前

    [quote]\G 表示前一个匹配的结束。这里指一次截取4个字符串。
    Java代码

    0098->7654->2410->0304->6435->28

    代码改为:
    Java代码

    System.out.println(StringUtils.join("0098765424100304643528".split("(?<=\G.{5})"), "->"));

    00987->65424->10030->46435->28

    可以参照的网址:
    http://developer.51cto.com/art/200902/110238.htm
    http://www.tutorialspoint.com/java/java_regular_expressions.htm
    http://www.regular-expressions.info/java.html[/quote]

    实际上?<=\G.{5})匹配是位置,然后在匹配的位置上加入替换符号。

    .{5}是任意5个字符。
    \G如liuqing_2010_07所述是表示前一个匹配的结束,也就是第一次匹配5个字符后的位置。这个在JAVA API java.util.regex.Pattern中有说明
    ?<=是逆向环视,可以理解为查看匹配的字符的左边是否为等号右边的值

    所以?<=\G.{5})匹配每5个字符且为该匹配字符的左边是上次匹配的结束位置,注意这里匹配的是位置。
    对于0098765424100304643528其实就是找00987|65424|10030|46435|28中|的位置,然后在该位置插入->。

    为什么不匹配 |00987|65424|10030|46435|28 是由于对于第一匹配00987 的左边不是\G

    点赞 评论 复制链接分享
  • iteye_16709 iteye_16709 9年前

    \G 表示前一个匹配的结束。这里指一次截取4个字符串。
    [code="java"]0098->7654->2410->0304->6435->28
    [/code]
    代码改为:
    [code="java"]
    System.out.println(StringUtils.join("0098765424100304643528".split("(?<=\G.{5})"), "->"));

    00987->65424->10030->46435->28
    [/code]

    可以参照的网址:
    [url]http://developer.51cto.com/art/200902/110238.htm[/url]
    [url]http://www.tutorialspoint.com/java/java_regular_expressions.htm[/url]
    [url]http://www.regular-expressions.info/java.html[/url]

    点赞 评论 复制链接分享

相关推荐