GVKun编程网logo

Java / Groovy正则表达式可解析无分隔符的键-值对(java正则表达式不包含特殊字符)

11

关于Java/Groovy正则表达式可解析无分隔符的键-值对和java正则表达式不包含特殊字符的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于Groovy/Java正则表达式循环遍历模式匹

关于Java / Groovy正则表达式可解析无分隔符的键-值对java正则表达式不包含特殊字符的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于Groovy / Java正则表达式循环遍历模式匹配、groovy : 正则表达式、Groovy Tip 16 正则表达式 一、Groovy Tip 19 正则表达式 二等相关知识的信息别忘了在本站进行查找喔。

本文目录一览:

Java / Groovy正则表达式可解析无分隔符的键-值对(java正则表达式不包含特殊字符)

Java / Groovy正则表达式可解析无分隔符的键-值对(java正则表达式不包含特殊字符)

您可以在第二组中捕获键之后的所有内容以及所有不以键开头的行

^(MA\d+)(.*(?:\R(?!MA\d).*)*)

模式匹配

  • ^字符串的开头
  • (MA\d+)捕获匹配MA和1位以上数字的第1组
  • (捕获第2组
    • .*匹配其余行
    • (?:\R(?!MA\d).*)*匹配所有不以MA开头且后跟数字的行,其中\R匹配任何unicode换行符序列
  • )关闭第2组

Regex demo

在Java中,转义的反斜杠加倍

final String regex = "^(MA\\d+)(.*(?:\\R(?!MA\\d).*)*)";
,

使用

(?ms)^(MA\d+)(.*?)(?=\nMA\d|\z)

请参见proof。

说明

                         EXPLANATION
--------------------------------------------------------------------------------
  (?ms)                    set flags for this block (with ^ and $
                           matching start and end of line) (with .
                           matching \n) (case-sensitive) (matching
                           whitespace and # normally)
--------------------------------------------------------------------------------
  ^                        the beginning of a "line"
--------------------------------------------------------------------------------
  (                        group and capture to \1:
--------------------------------------------------------------------------------
    MA                       'MA'
--------------------------------------------------------------------------------
    \d+                      digits (0-9) (1 or more times (matching
                             the most amount possible))
--------------------------------------------------------------------------------
  )                        end of \1
--------------------------------------------------------------------------------
  (                        group and capture to \2:
--------------------------------------------------------------------------------
    .*?                      any character (0 or more times (matching
                             the least amount possible))
--------------------------------------------------------------------------------
  )                        end of \2
--------------------------------------------------------------------------------
  (?=                      look ahead to see if there is:
--------------------------------------------------------------------------------
    \n                       '\n' (newline)
--------------------------------------------------------------------------------
    MA                       'MA'
--------------------------------------------------------------------------------
    \d                       digits (0-9)
--------------------------------------------------------------------------------
   |                        OR
--------------------------------------------------------------------------------
    \z                       the end of the string
--------------------------------------------------------------------------------
  )                        end of look-ahead

Groovy / Java正则表达式循环遍历模式匹配

Groovy / Java正则表达式循环遍历模式匹配

我有一个字符串,其中包含一些以十六进制表示的字节,我想要提取.例如:

String str = "051CF900: 00 D3 0B 60 01 A7 16 C1  09 9C"

我想提取值并将它们连接在一个字符串中,使它看起来像:

00D30B6001A716C1099C

我的尝试:

String stream = "";
Pattern pattern = Pattern.compile("\\b[A-F0-9]{2}\\b");
matcher = pattern.matcher(str);
matcher.find{ newByte ->
  println(newByte);
  stream += newByte;
};
println(stream);

当我尝试将每个字节添加到流时,它似乎停止循环.如果我删除该行,则每个字节都会成功打印出来.当我将newByte添加到流时,为什么循环会中断?

解决方法:

由于这是Groovy,您可以将所有代码更改为:

String stream = str.findAll( /\b[A-F0-9]{2}\b/ ).join()

groovy : 正则表达式

groovy : 正则表达式

groovy 正则表达式 企图模仿Perl 的语法,结果是我试用后,发现没法提取匹配的字符串。

还是直接引用 java.util.regex  负责对字符序列进行正则表达式匹配

先转载水木清华上的例子 RegexTest.java

import java.util.regex.*; 

/** 
*  java.util.regex  负责对字符序列进行正则表达式匹配 
*  Pattern负责编译 
*  Matcher负责匹配 
*	字符串: (010)abcdefg{beijing}opjhhkk
*	正则模式: /\((\d+)\).*\{([a-zA-Z]+)\}/  
*/
public class RegexTest { 
   public static void main(String [] args) { 
     Pattern p = Pattern.compile("\\((\\d+)\\).*\\{([a-zA-Z]+)\\}"); 
     Matcher m = p.matcher("(010)abcdefg{beijing}opjhhkk "); 
     if (m.find()) { 
         System.out.println(m.group(0)); // (010)abcdefg{beijing}opjhhkk  
         System.out.println(m.group(1)); // 010 
         System.out.println(m.group(2)); // beijing 
     } 
   } 
 }
运行 java RegexTest

以下原创:
我想从一行字符串中提取身份证号码 regexTest.groovy

import java.util.regex.*; 

/** 
*   字符串: 1234567890123456789 ID:44010119800101246X abcdefg
*   正则式1: /ID.+(\d{17}[0-9Xx])/ 
*   正则式2: /(\d{18}).*ID.+(\d{17}[0-9Xx])/
*/
public class RegexTest { 
   public static void main(String [] args) { 
     Pattern p = Pattern.compile("ID.+(\\d{17}[0-9Xx])"); 
     Matcher m = p.matcher(" 1234567890123456789 ID:44010119800101246X abcdefg "); 
     if (m.find()) { 
      int g = m.groupCount();
      println("groups: "+g);
      for(int i=0; i<=g; i++){
         println(i+": "+m.group(i));
      }
     } 
   } 
 }
运行 groovy regexTest

Groovy Tip 16 正则表达式 一

Groovy Tip 16 正则表达式 一

                               Groovy Tip 16 正则表达式 一
 
 
在Groovy语言中,增加了正则表达式的匹配运算符“==~”。一个简单的例子如下:
     
      println "friends" ==~ /friends/
 
 
打印结果为: true
可以看到,在 Groovy 语言中,正则表达式的匹配运算非常简单。麻烦的是一些通配符需要记住,然后加以灵活运用。如下:
a?                 表示一个或零个 a
a*                 表示零个或 n a (零个或以上)
a+                  表示 n a 1 个或以上)
a{n}               表示 n a (如, a{3} 表示 3 a ,即 aaa
a|b                表示 a b
[abcd]              表示 a b c d ,相当于 a|b|c|d
[a-z]               表示 a z 之间的任意一个,同理 [A-Z] A Z 之间的任意一个
^a                 表示非 a
()                  表示一个正则表达式,如 (ab) 匹配 ab
.                    表示任意一个字符
 
 
以上是比较常用的一些通配符,有了上面的一些基础知识,才能做正则运算,下面试举出一些例子。
比如,我们要匹配一个数字,如:
       def str = ''1000.31''
 
首先我们要匹配小数点以前的整数位,数字的正则表达式为/[0-9]/,这表示一个数字位,那么多位数的整数的正则表达式为:/[0-9]+/,“+”表示一个以上,见上面的说明。
接着要匹配小数点,值得注意的是“.”本身是一个通配符,所以要用转义符来表示,即/.表示小数点。再来匹配小数点后的数字,同样是/[0-9]+/。
所以匹配小数点以及小数位就是//.[0-9]+/。
因为小数位可以有,也可以没有,没有则是一个整数,所以小数位的正则表达式为/(/.[0-9]+)?/,“?”表示“(/.[0-9]+)”有零个或一个。
所以数字的正则表达式为:
 
    def re = /[ 0 - 9 ]+(/.[ 0 - 9 ]+)?/
 
我们来测试一下:
             
       println str ==~ re
 
结果为:true
同理,我们可以分析一个邮箱的正则表达式:
       def str = ''fxx12_ee@sina.com''
      
       def re = /[a-zA-Z][^@/.]+@[^@/.]+/.[^@/.]+/
      
    println str ==~ re
 
邮箱以字母开头,所以 re / [a-zA-Z] / 开头 ; 接着是非 @ 非“ . ”的任意字符,即 / [^@ /.]+ /; 然后是 @ ;把上面的正则连接起来为: / [a-zA-Z][^@ /.]+@ /
然后是非 @ 的任意字符,即 / [^@ /.]+ /; 接着是 . ;最后又是非 @ 非“ . ”的任意字符。
所以将上面的分析连接起来,为 /[a-zA-Z][^@/.]+@[^@/.]+/.[^@/.]+/
 
 
现在,我们来匹配一个手机号码:
       def str = ''13640901345''
      
       def re = / 13 [ 0 - 9 ]{ 9 }/
      
    println str ==~ re
 
即以 13 开头,后面连续 9 个数字。
 
现在,我们来匹配新浪或搜狐的邮箱:
       def str = ''fxxfg_001@sohu.com''
      
       def re = /[a-zA-Z][^@/.]+@((sina.com)|(sohu.com))/
      
    println str ==~ re
 
结果为: true
      
       def str = ''fxxfg_001@sina.com''
      
       def re = /[a-zA-Z][^@/.]+@((sina.com)|(sohu.com))/
      
    println str ==~ re
 
结果也为: true
      
       def str = ''fxxfg_001@163.com''
      
       def re = /[a-zA-Z][^@/.]+@((sina.com)|(sohu.com))/
      
    println str ==~ re
 
结果就是: false

Groovy Tip 19 正则表达式 二

Groovy Tip 19 正则表达式 二

                             Groovy Tip 19 正则表达式

 

 

我们在前一篇的《正则表达式》中重点谈到了Groovy语言的一些重要的通配符,可以说那些通配符是一些标准的和基础的通配符。看过了那些通配符以后,我就常常在想,Groovy语言作为一种敏捷性的动态语言,会不会有一些更为方便的通配符呢?

如我们所愿,Groovy语言为我们提供了如下的一些更为简便的通配符:

 

/d                  数字字符

/D                 非数字字符

/s                  空格符

/S                  非空格符

/w                  文字字符

/W                  非文字字符

/b                   单词标记

^                    语句行的开头

$                    语句行的结尾

 

 

 

可以看到,这些通配符正是在以前通配符的基础上,对一些常用的正则表达式做进一步的通配,以达到简化我们编码的目的。下面试举几个例子来看看这些通配符的用法。

 

通配符“/d”就是对数字字符的通配,比如:

 

      def str3 = ''3''

     

      @H_126_301@println str3 ==~ //d/

 

就打印“true”,而

 

 

       def str8 = ''a''

      

       @H_126_301@println str8 ==~ //d/

 

就打印“false”。

我们在前一篇的《正则表达式》中有一个匹配数字的例子,是这样的:

def str = ''1000.31''

def re = /[0-9]+(/.[0-9]+)?/

@H_126_301@println str ==~ re

 

这个正则表达式就有点长了,我们现在使用“/d”通配符就可以把上面的正则表达式简化成下面的样子:

 

       def re = //d+(/./d+)?/

             

       def str = 1000.31

      

       @H_126_301@println str ==~ re

 

 

 

而“/D”匹配的则是非数字,如:

 

     

      def str4 = ''w''

     

  @H_126_301@println str4 ==~ //D/

 

/s”匹配的是空格,如:

      

       @H_126_301@println ''  '' ==~ //s+/

 

所有非空格的通配符则是“/S”。

/w”匹配的是单词的字母,相当于“/[a-zA-Z]/”,如:

     

      def str1 = ''a''

     

  @H_126_301@println str1 ==~ //w/

 

而所有的非单词字母符号的通配符为“/W”,如:

 

      def str5 = ''&''

     

  @H_126_301@println str5 ==~ //W/

 

/b”指的是单词标记,如:

 

       def hw = ''hello''

      

       @H_126_301@println hw ==~ //b/w+/b/

 

以“ed”结尾的过去式的匹配为:

 

       def word = ''moved''

      

       @H_126_301@println word ==~ //b/w+ed/b/

   

而下面的例子则不匹配:

 

       def w1 = ''ran''

      

       @H_126_301@println w1 ==~ //b/w+ed/b/

 

 

而“^”则注意要跟“[^]”区别开来,“^”表示以什么开头,而“[^]”则表示非。如下面所示的例子。

下面的例子表示非abc三个字母的所有符号:

 

       @H_126_301@println ''f'' ==~ /[^abc]/

 

下面的例子则不匹配:

 

       @H_126_301@println ''b'' ==~ /[^abc]/

 

   

而下面的例子则表示以“abc”开头的匹配:

 

    @H_126_301@println ''abcd'' ==~ /^abc./

 

而下面的例子却不匹配:

 

    @H_126_301@println ''adcd'' ==~ /^abc./

今天的关于Java / Groovy正则表达式可解析无分隔符的键-值对java正则表达式不包含特殊字符的分享已经结束,谢谢您的关注,如果想了解更多关于Groovy / Java正则表达式循环遍历模式匹配、groovy : 正则表达式、Groovy Tip 16 正则表达式 一、Groovy Tip 19 正则表达式 二的相关知识,请在本站进行查询。

本文标签: