How to parse OR AND within text
假设你有一行 String condition = "A or B and C"; 语句,请问怎么做才能变成一行真正的逻辑表达式(能在计算机中运行计算)?
Resolution
- 声明一个
List<List<String>>结构; - 先分割 or ;
变成 [ A, B and C ] - 不包含and的,插入
List<List<String>>结构;
List<List<String>>.add( [A] ) - 声明一个
List<String>, 再分割 and;
List<String>.add(B);
List<String>.add(C); - 把④加入
List<List<String>>结构,
List<List<String>>.add( [B, C]); - 最终
List<List<String>>结构如下:
[ [A], [B,C] ] - 这个
List<List<String>>结构里面的条件语句就是任意一行必须为真语句,简而言之:判断A是不是为真,A为真则整个结构都为真, 或者判断[B, C]是否都为真,如果都为真则整个结构都为真。以此类推。
Example 2
如果是从文本里一行一行的读取用户的自定义配置,并且每行后面是一些特殊的Payload,就有可能会混着OR 、AND 语句,那就不适合使用上面的分割法,容易将Payload也分割了。
NO, IamSentence A
OR, IamSentence B
AN, IamSentence C
先固定Text的逻辑关键词的长度,NO表示第一行,OR=or, AN=and。
思路就是:
- 先将所有语句都并列成一句来分析,
NO A OR B AN C=A OR (B AN C),就能看出整体性的逻辑; - 循环所有语句;
- 先将第一行的NO 语句存储起来;
- Next 无非就是
AN或OR两种情况,针对这两个条件分别做不同的处理即可;
Java代码实现该算法:
public static void main(String[] args) {
List<String> rawSentence = new ArrayList<String>();
rawSentence.add("NO, IamSentence A");
rawSentence.add("OR, IamSentence B");
rawSentence.add("AN, IamSentence C");
parseAnOr(rawSentence);
}
public static List<List<String>> parseAnOr(List<String> rawSentence) {
List<List<String>> allList = new ArrayList<>();
String temp = "";
String last = "";
ArrayList<String> tempList = new ArrayList<String>();
for (int i = 0; i < rawSentence.size(); i++) {
if (rawSentence.get(i).substring(0, 2).equals("NO")) {
last = rawSentence.get(i).substring(3);
last = last.trim();
}
if (rawSentence.get(i).substring(0, 2).equals("OR")) {
if (!last.equals("")) {
tempList.add(last);
last = "";
allList.add(new ArrayList<>(tempList));
tempList.clear();
}
if (tempList.size() > 0) {
allList.add(new ArrayList<>(tempList));
tempList.clear();
}
//
last = rawSentence.get(i).substring(3);
last = last.trim();
tempList.clear();
}
if (rawSentence.get(i).substring(0, 2).equals("AN")) {
tempList.add(last);
last = "";
last = rawSentence.get(i).substring(3);
last = last.trim();
}
}
if (!last.equals("")) {
tempList.add(last);
allList.add(new ArrayList<>(tempList));
}
System.out.println(allList);
return allList;
}
out
[[IamSentence A], [IamSentence B, IamSentence C]]
Practice
If it were A or B and C and D or E, what would you do?
How to parse OR AND within text的更多相关文章
- 使用 JSON.parse 反序列化 ISO 格式的日期字符串, 将返回Date格式对象
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- go标准库的学习-text/template
参考:https://studygolang.com/pkgdoc 导入方式: import "text/template" template包实现了数据驱动的用于生成文本输出的模 ...
- How to return plain text from AWS Lambda & API Gateway
With limited experience in AWS Lambda & API Gateway, it's struggling to find the correct way to ...
- JSON对象和JSON字符串以及JSON.parse 函数的使用
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- JSON.parse 的用法,在js中用的。也是反序列化用法。
参数 text 必需. 一个有效的 JSON 字符串. reviver 可选. 一个转换结果的函数. 将为对象的每个成员调用此函数. 如果成员包含嵌套对象,则先于父对象转换嵌套对象. 对于每个成员,会 ...
- 从 Newtonsoft.Json 迁移到 System.Text.Json
一.写在前面 System.Text.Json 是 .NET Core 3 及以上版本内置的 Json 序列化组件,刚推出的时候经常看到踩各种坑的吐槽,现在经过几个版本的迭代优化,提升了易用性,修复了 ...
- C# ListView点击列头进行排序
/// <summary> /// This class is an implementation of the 'IComparer' interface. /// </summa ...
- J2EE项目开发中常用到的公共方法
在项目IDCM中涉及到多种工单,包括有:服务器|网络设备上下架工单.服务器|网络设备重启工单.服务器光纤网线更换工单.网络设备撤线布线工单.服务器|网络设备替换工单.服务器|网络设备RMA工单.通用原 ...
- Java 中类型转换
int -> String int i=12345; String s=""; 第一种方法:s=i+""; 第二种方法:s=String.valueOf( ...
- C#算法知识点记录
针对算法的知识点进行记录 简易桶排序 首先看一个简易桶排序,有一串数字,进行从大到小排列.数字间隔不大,使用一维数组来当作桶,进行插入排序. static void Main(string[] arg ...
随机推荐
- Centos6yum源切换
CentOS 6操作系统版本结束了生命周期(EOL),Linux社区已不再维护该操作系统版本.建议您升级操作系统至CentOS 7及以上,如果您的业务过渡期仍需要使用CentOS 6系统中的一些安装包 ...
- ChatGPT小型平替之ChatGLM-6B本地化部署、接入本地知识库体验
本文期望通过本地化部署一个基于LLM模型的应用,能让大家对构建一个完整的应用有一个基本认知.包括基本的软硬环境依赖.底层的LLM模型.中间的基础框架及最上层的展示组件,最终能达到在本地零编码体验的目的 ...
- 记录一个在写项目中遇到的Maven依赖无法导入的问题
记录一个在写项目中遇到的Maven依赖无法导入的问题 项目是一个父项目做依赖管理,三个子项目,今天遇到一个问题: 子项目中导入的依赖,怎么都导入不进去,maven仓库中已经有了,idea提示也没有问题 ...
- 代码发布平台jenkins中Check-out Strategy选项功能意义
第一个选项:Use'svn update' as much as possible 这个选项能实现快速发布:Use 'svn update' whenever possible, making th ...
- 解决github网站打不开
方法一(此方法无效则选 方法二) 发现github经常打不开无法访问,最近尝试了下改host发现效果挺好,方法如下(windows电脑): 进入站长工具网站的域名解析网址:http://tool.ch ...
- 使用LabVIEW实现 DeepLabv3+ 语义分割含源码
前言 图像分割可以分为两类:语义分割(Semantic Segmentation)和实例分割(Instance Segmentation),前面已经给大家介绍过两者的区别,并就如何在labview上实 ...
- 【HTML】TinyMCE 编辑器
HTML编辑器 一.页面效果 二.引入JS.CSS <!DOCTYPE html> <html lang="en"> <head> <me ...
- 如何给Github上的开源项目提交PR?
前言 对于一个热爱开源的程序员而言,学会给GitHub上的开源项目提交PR这是迈出开源的第一步.今天我们就来说说如何向GitHub的开源项目提交PR,当然你提交的PR可以是一个项目的需求迭代.也可以是 ...
- linux内核笔记(二)微机计算机组成结构
一个系统有四个基本组成部分: 输入部分:接收系统的数据(键盘等) 处理中心:处理(cpu) 能源部分:处理需要的硬件资源(内存等) 输出部分:显示给用户(显示器等) 计算机系统分为: 计算机系统分为软 ...
- javascript中一些难以理解的专有名词 2(也不是很专有)
作用域链 让人迷惑的例子 function foo() {console.log(v)} function foo1() { var v = "v1" foo() console. ...