正则表达式匹配ascii字符

时间:2017-09-26 09:38:40

标签: regex scala

我想匹配字符串

的正则表达式
2=abc\u000148=123\u0001

解释

  1. SOH(\u0001) characeter分隔的键值对
    • 键 - 数字
    • 值可以是数字,字母,小数的字符串
  2. 键和值由"="
  3. 分隔

    我试过的正则表达式是

    [0-9]=.*[u0001]+
    

    但它没有正确匹配

    更新

    • 我有一个数字列表val num =Seq(2,3,4)
    • 而不是发现我想从字符串
    • 中删除匹配项 我要替换的
    • 键来自列表 num
    • 中的值

    输入

     2=abc\u000148=123\u00013=def\u0001
    

    输出它是过滤后的字符串

    148=123\u0001 ,where keys which match value 2 and 3 are removed from list
    
    object Main extends App {
    
      val s = "2=abc\u000148=123\u00013=def\u0001"
      val num = Seq(2,3)
      for (e <- num) {
        val p = s"(\\$e+)=([^\u0001]*)".r
        test(p)
    
      }
    
      private def test(p: Regex) = {
        p.findAllIn(s).matchData foreach {
          m => println(m.group(1) + " : " + m.group(2))
    
        }
      }
    }
    

2 个答案:

答案 0 :(得分:2)

您需要动态构建模式:

s"\\b(?:${num.mkString("|")})=[^\\u0001]*\\u0001*"

<强>详情

  • \b - 字边界
  • (?:num1|num2...|numN) - num变量
  • 中的任何值
  • = - 等号
  • [^\u0001]* - 除SOH字符以外的零个或多个字符(十进制代码为1的字符)
  • \u0001* - 零个或多个SOH字符。

查看Scala demo

val num = Seq(2,3)
val s = "1041=pqr\u000148=xyz\u000122=8\u00012=abc\u000148=123\u00013=def\u0001"
val pattern = s"\\b(?:${num.mkString("|")})=[^\\u0001]*\\u0001*"
// println(pattern) // => \b(?:2|3)=[^\u0001]*\u0001*
println(s.replaceAll(pattern, ""))
// => 1041=pqr\u000148=xyz\u000122=8\u000148=123\u0001

答案 1 :(得分:-1)

你在想这个吗?

[0-9]+=.*?\[u0-9\.,]+