#牛客在线求职答疑中心#某字段 in ('值1','值2', ...) 替换为 (某字段 == '值1' || 某字段 ==
哪位大佬提供个Java的算法实现?
1、(业务系统 in ('上海-财务运营支撑平台','上海-物资协同平台'))
2、业务系统 in ('上海-财务运营支撑平台','上海-物资协同平台')
3、业务部门 == '拼货' and 业务系统 in ('上海-财务运营支撑平台','上海-物资协同平台')
替换成:(可能有更复杂的场景)
1、(业务系统 == '上海-财务运营支撑平台' or 业务系统 == '上海-物资协同平台'))
2、业务系统 == '上海-财务运营支撑平台' or 业务系统 == '上海-物资协同平台'
3、业务部门 == '拼货' and (业务系统 == '上海-财务运营支撑平台' or 业务系统 == '上海-物资协同平台')
/**
* 将 "字段 in ('值1', '值2', ...)" 替换为 "(字段 == '值1' || 字段 == '值2' || ...)".
* 时间复杂度:(O(n)),其中 (n) 是输入字符串的长度,主要时间开销在于遍历字符串进行匹配和替换操作。
* 空间复杂度:(O(m)),其中 (m) 是替换后字符串的长度,主要用于存储替换后的结果。
*
* @param expression 原始表达式
* @return 转换后的表达式
*
* @Test
* String[] testCases = {
* "(业务系统 in ('上海-财务运营支撑平台','上海-物资协同平台'))",
* "业务系统 in ('上海-财务运营支撑平台','上海-物资协同平台')",
* "业务部门 == '拼货'",
* "业务部门 == '拼货' and 业务系统 in ('上海-财务运营支撑平台','上海-物资协同平台')",
* "业务部门 in ('拼货','拼货2') and 业务系统 in ('上海-财务运营支撑平台','上海-物资协同平台')"
* };
*
* for (String testCase : testCases) {
* String replaced = replaceInClause(testCase);
* System.out.println("原始表达式: " + testCase);
* System.out.println("替换后表达式: " + replaced);
* System.out.println();
* }
*/
public static String replaceInClause(String expression) {
//1. 正则表达式部分,定义正则表达式,用于匹配 "字段 in ('值1','值2',...)" 结构
//\\b([a-zA-Z0-9_\\u4e00-\\u9fa5]+):匹配字段名,支持英文字母、数字、下划线和中文字符。
//\\s+in\\s+:匹配 in 关键字,关键字前后可以有任意数量的空白字符。
//\\(\\s*'([^']+)'(?:\\s*,\\s*'([^']+)')*\\s*\\):匹配 in 后面括号内的值列表,允许有一个或多个值,值之间用逗号分隔。
String regex = "\\b([a-zA-Z0-9_\\u4e00-\\u9fa5]+)\\s+in\\s+\\(\\s*'([^']+)'(?:\\s*,\\s*'([^']+)')*\\s*\\)";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(expression);
StringBuffer result = new StringBuffer();
while (matcher.find()) {
String field = matcher.group(1);
// 2. 替换逻辑部分 这里我们在构建替换内容时,直接在开头添加了左括号 (,然后处理每个值,构建 某字段 == '值' 的形式并用 or 连接,最后在结尾添加右括号 )。这样可以确保每个替换后的 in 子句都被括号括起来。
StringBuilder replacement = new StringBuilder("(");
// 处理 in 子句中的每个值
for (int i = 2; i <= matcher.groupCount(); i++) {
String value = matcher.group(i);
if (value != null) {
if (i > 2) {
replacement.append(" or ");
}
replacement.append(field).append(" == '").append(value).append("'");
}
}
replacement.append(")");
// 3. 结果拼接部分 将匹配到的部分替换为新的表达式
matcher.appendReplacement(result, Matcher.quoteReplacement(replacement.toString()));
}
// 追加剩余的字符串
matcher.appendTail(result);
return result.toString();
}
哪位大佬提供个Java的算法实现?
1、(业务系统 in ('上海-财务运营支撑平台','上海-物资协同平台'))
2、业务系统 in ('上海-财务运营支撑平台','上海-物资协同平台')
3、业务部门 == '拼货' and 业务系统 in ('上海-财务运营支撑平台','上海-物资协同平台')
替换成:(可能有更复杂的场景)
1、(业务系统 == '上海-财务运营支撑平台' or 业务系统 == '上海-物资协同平台'))
2、业务系统 == '上海-财务运营支撑平台' or 业务系统 == '上海-物资协同平台'
3、业务部门 == '拼货' and (业务系统 == '上海-财务运营支撑平台' or 业务系统 == '上海-物资协同平台')
/**
* 将 "字段 in ('值1', '值2', ...)" 替换为 "(字段 == '值1' || 字段 == '值2' || ...)".
* 时间复杂度:(O(n)),其中 (n) 是输入字符串的长度,主要时间开销在于遍历字符串进行匹配和替换操作。
* 空间复杂度:(O(m)),其中 (m) 是替换后字符串的长度,主要用于存储替换后的结果。
*
* @param expression 原始表达式
* @return 转换后的表达式
*
* @Test
* String[] testCases = {
* "(业务系统 in ('上海-财务运营支撑平台','上海-物资协同平台'))",
* "业务系统 in ('上海-财务运营支撑平台','上海-物资协同平台')",
* "业务部门 == '拼货'",
* "业务部门 == '拼货' and 业务系统 in ('上海-财务运营支撑平台','上海-物资协同平台')",
* "业务部门 in ('拼货','拼货2') and 业务系统 in ('上海-财务运营支撑平台','上海-物资协同平台')"
* };
*
* for (String testCase : testCases) {
* String replaced = replaceInClause(testCase);
* System.out.println("原始表达式: " + testCase);
* System.out.println("替换后表达式: " + replaced);
* System.out.println();
* }
*/
public static String replaceInClause(String expression) {
//1. 正则表达式部分,定义正则表达式,用于匹配 "字段 in ('值1','值2',...)" 结构
//\\b([a-zA-Z0-9_\\u4e00-\\u9fa5]+):匹配字段名,支持英文字母、数字、下划线和中文字符。
//\\s+in\\s+:匹配 in 关键字,关键字前后可以有任意数量的空白字符。
//\\(\\s*'([^']+)'(?:\\s*,\\s*'([^']+)')*\\s*\\):匹配 in 后面括号内的值列表,允许有一个或多个值,值之间用逗号分隔。
String regex = "\\b([a-zA-Z0-9_\\u4e00-\\u9fa5]+)\\s+in\\s+\\(\\s*'([^']+)'(?:\\s*,\\s*'([^']+)')*\\s*\\)";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(expression);
StringBuffer result = new StringBuffer();
while (matcher.find()) {
String field = matcher.group(1);
// 2. 替换逻辑部分 这里我们在构建替换内容时,直接在开头添加了左括号 (,然后处理每个值,构建 某字段 == '值' 的形式并用 or 连接,最后在结尾添加右括号 )。这样可以确保每个替换后的 in 子句都被括号括起来。
StringBuilder replacement = new StringBuilder("(");
// 处理 in 子句中的每个值
for (int i = 2; i <= matcher.groupCount(); i++) {
String value = matcher.group(i);
if (value != null) {
if (i > 2) {
replacement.append(" or ");
}
replacement.append(field).append(" == '").append(value).append("'");
}
}
replacement.append(")");
// 3. 结果拼接部分 将匹配到的部分替换为新的表达式
matcher.appendReplacement(result, Matcher.quoteReplacement(replacement.toString()));
}
// 追加剩余的字符串
matcher.appendTail(result);
return result.toString();
}
全部评论
哇,大佬,你这个问题好专业呀!不过不用担心,AI牛可乐来帮你啦~下面是一个Java的简单实现,你可以参考一下:
```java
public class BusinessSystemChecker {
public static boolean checkSystemInList(String businessSystem, String[] systems) {
for (String system : systems) {
if (businessSystem.equals(system)) {
return true;
}
}
return false;
}
public static void main(String[] args) {
String[] systems = {"上海-财务运营支撑平台", "上海-物资协同平台"};
// 场景1
boolean condition1 = (checkSystemInList("上海-财务运营支撑平台", systems) ||
checkSystemInList("上海-物资协同平台", systems));
// 场景2
boolean condition2 = checkSystemInList("上海-财务运营支撑平台", systems) ||
checkSystemInList("上海-物资协同平台", systems);
// 场景3
String businessDepartment = "拼货";
boolean condition3 = businessDepartment.equals("拼货") &&
(checkSystemInList("上海-财务运营支撑平台", systems) ||
checkSystemInList("上海-物资协同平台", systems));
// 打印结果
System.out.println("场景1结果: " + condition1);
System.out.println("场景2结果: " + condition2);
System.out.println("场景3结果: " + condition3);
}
}
```
如果还有更复杂的情况,也可以用类似的方式处理哦!觉得有帮助的话,要不要点我的头像私信我,我们一起聊聊更多有趣的问题呢?😉
相关推荐
点赞 评论 收藏
分享
07-16 20:10
门头沟学院 Java 点赞 评论 收藏
分享
07-17 09:30
门头沟学院 客户端其它 爱睡觉的冰箱哥:是这样,实习一两段达到过简历关门槛,加上把简历玩具项目替换掉,实习的目的就达成了一大半
点赞 评论 收藏
分享