最近,我们有个大调整,为了控制代码的质量,需要使用一些伪代码让业务人员编写应用逻辑(其实这么做完全是处于研发效能的考虑,95%以上的代码不需要特别注意都不会导致系统性风险,),然后通过工具自动生成实际的java和SQL代码,其中有个关键点就是处理其中的变量和参数,我们使用了特定的模式进行处理,典型的伪代码类似如下:

set @机构编号# = @操作员机构编号#;
[原子_系统状态检查]
[原子_市场检查]
[原子_权限检查]
set @交易日期# = @初始化日期#;
[原子_交易日期检查]
[原子_交易时间检查]
[事务_证券订单重复检查]
#订单批号小于0,用于老系统的对接. 获取产品资产账户和股东代码
if @订单批号# < 0 then
[原子_交易单元获取产品序号资产账户股东代码]
else
[原子_账户检查]
[原子_校验交易单元的操作权限]
end if; [原子_交易单元业务权限判断]
if @指令序号# <> 0 then
[事务_证券订单交易校验指令业务]
end if;
[原子_证券订单代码校验]
if @订单方向# = 1 then
[原子_证券订单计算费用]
end if;
[原子_证券订单业务校验]
[原子_交易端证券业务合规判断]
[检查报错返回][@合规触发类型# = 4][][concat("订单触发风控合规禁止条件:", @合规触发信息#)]

我们需要解析出其中的变量和参数,因为我们不打算让工具去控制逻辑语法,所以只要翻译出即可,比如[检查报错返回][@合规触发类型# = 4][1][concat("订单触发风控合规禁止条件:", @合规触发信#)]要解析出”检查报错返回“是宏,后面的是参数,@合规触发类型#是变量。可使用正则表达式如下:

    public static void main(String[] args) {
System.out.println("解析宏: ");
parseMacro();
System.out.println("解析标准字段: ");
parseField();
} /**
*
*/
private static void parseField() {
String str = "[检查报错返回][@合规触发类型# = 4][1][concat(\"订单触发风控合规禁止条件:\", @合规触发信息#)]";
String regex = "\\@.*?\\#";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(str);
System.out.println("replace: "+str.replaceAll(regex, "matcher "));
while (matcher.find()) {
System.out.println("matcher: " + matcher.group(0));
}
} /**
*
*/
private static void parseMacro() {
String str = "[检查报错返回][@合规触发类型# = 4][1][concat(\"订单触发风控合规禁止条件:\", @合规触发信息#)]";
String regex = "\\[.*?\\]";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(str);
System.out.println("replace: "+str.replaceAll(regex, "matcher "));
while (matcher.find()) {
System.out.println("matcher: " + matcher.group(0));
}
}

结果如下:

解析宏:
replace: matcher matcher matcher matcher
matcher: [检查报错返回]
matcher: [@合规触发类型# = 4]
matcher: [1]
matcher: [concat("订单触发风控合规禁止条件:", @合规触发信息#)]
解析标准字段:
replace: [检查报错返回][matcher = 4][1][concat("订单触发风控合规禁止条件:", matcher )]
matcher: @合规触发类型#
matcher: @合规触发信息#

java 正则匹配括号对以及其他成对出现的模式的更多相关文章

  1. java 正则匹配空格字符串 正则表达式截取字符串

    java 正则匹配空格字符串 正则表达式截取字符串 需求:从一堆sql中取出某些特定字符串: 比如配置的sql语句为:"company_code = @cc and project_id = ...

  2. 通用且常用的Java正则匹配工具,用以检查邮箱名、电话号码、用户密码、邮政编码等合法性

    一个通用且常用的Java正则匹配工具,用以检查邮箱名.电话号码.用户密码.邮政编码等合法性. import java.util.regex.Matcher; import java.util.rege ...

  3. java正则匹配

    java正则提取需要用到Matcher类,下面给出案例示例供参考 需要提取车牌号中最后一个数字,比如说:苏A7865提取5,苏A876X提取6import java.util.regex.Matche ...

  4. 关于JAVA正则匹配空白字符的问题

    今天遇到一个字符串,怎么匹配空格都不成功!!! 我把空格复制到test.properties文件 显示“\u3000” ,这是什么? 这是全角空格!!! 查了一下    \s    不支持全角 1.& ...

  5. 关于JAVA正则匹配空白字符的问题(全角空格与半角空格)

    今天遇到一个字符串,怎么匹配空格都不成功!!! 我把空格复制到test.properties文件 显示“\u3000” ,这是什么? 这是全角空格!!! 查了一下    \s    不支持全角 1.& ...

  6. java:正则匹配Pattern,Matcher

    一.正则匹配Pattern,Mather String s = "aa424fsfsd92lfjw2755097"; Pattern p = Pattern.compile(&qu ...

  7. java正则获取括号内的数据与排除括号内的数据

    1.正则获取括号内的数据 /** * 获取指定字符串中括号内的内容,返回字符串数组 * @param content * @return */ public String[] getBracketCo ...

  8. java正则匹配${xxx} 排除单引号双引号内的内容,前提引号必须成对出现

    public static void main(String[] a) { String wpp = "select 1, ${mark} '``this is, `/message22` ...

  9. java正则匹配 指定内容以外的 内容

    今天,遇到一个需要 匹配出 指定内容以外的 内容的需求. 乍一看,需求貌视很简单啊,直接上 非贪婪模式的 双向零宽断言(有的资料上也叫 预搜索.预查.环视lookaround): 比如,我要匹配 串内 ...

随机推荐

  1. javascript 笔记!

    1.通过javascript向文档中输出文本 document是javascript的内置对象,代表浏览器的文档部分 document.write("Hello Javascript&quo ...

  2. JavaScript将字符串中的每一个单词的第一个字母变为大写其余均为小写

    要求: 确保字符串的每个单词首字母都大写,其余部分小写. 这里我自己写了两种方法,或者说是一种方法,另一个是该方法的变种. 第一种: function titleCase(str) { var new ...

  3. Flexible 弹性盒子模型之CSS flex-flow

    实例 让弹性盒的元素以相反的顺序显示,且在必要的时候进行拆行: display:flex; flex-flow:row-reverse wrap;   效果预览 浏览器支持 表格中的数字表示支持该属性 ...

  4. BPM合同管理解决方案分享

    一.方案概述合同是组织与组织间所订协议的法律 表现形式,体现着双方对于合作在法律和道德上的承诺.然而,大多数企业的合同管理都或多或少存在合同审批过程不规范.签订草率.审批权责不清.合同执行跟踪难.合同 ...

  5. TFS 2015 敏捷开发实践 – 看板的使用

    看板在现代应用开发过程中使用非常广泛,不管是使用传统的瀑布式开发还是敏捷开发,都可以使用看板管理.因为看板拥有简单的管理方法,直观的显示方式,所以很多软件开发团队选择使用看板进行软件开发管理.本文不在 ...

  6. oracle 误删数据恢复

    1.根据时间点查系统版本号scn: select timestamp_to_scn(to_timestamp('2013-01-07 11:20:00','YYYY-MM-DD HH:MI:SS')) ...

  7. 解决托管在Windows上的Stash的Pull request无法合并的问题

    最近尝试合并一个托管在Windows的Stash系统中的pull request时,发现合并按钮被禁用,显示有冲突不能合并,但是在diff页面中没有现实冲突,而且代码实际上并没有任何冲突. 后来在这篇 ...

  8. Unity AssetBundle爬坑手记

    这篇文章从AssetBundle的打包,使用,管理以及内存占用各个方面进行了比较全面的分析,对AssetBundle使用过程中的一些坑进行填补指引以及喷!   AssetBundle是Unity推荐的 ...

  9. 一步步构造自己的vue2.0+webpack环境

    前面vue2.0和webpack都已经有接触了些(vue.js入门,webpack入门之简单例子跑起来),现在开始学习如何构造自己的vue2.0+webpack环境. 1.首先新建一个目录vue-wk ...

  10. 【Win 10 应用开发】文件读写的三种方案

    本文老周就跟伙伴们探讨一下关于文件读写的方法.总得来说嘛,有三种方案可以用,而且每种方案都各有特色,也说不上哪种较好.反正你得记住老祖宗留给我们的大智慧——事无定法,灵活运用者为上. OK,咱们开始吧 ...