【问题标题】:Complex Pattern Match复杂模式匹配
【发布时间】:2019-10-07 22:25:58
【问题描述】:

我一直在思考这个问题,包括尝试一些正则表达式之外的东西,我需要两个匹配这个的正则表达式

'Name in "{Name1, Name2}"' and  'Name in "(Name1, Name2)"'

更精确地匹配 'Name' 和 'Name1, Name2',即 Name、Name1 和 Name2 的任意单词和空格组合。

这就是我所拥有的

'(\\b)(\\s)in(\\s)\\\"{.+?}\\\"'

【问题讨论】:

  • 所以你需要匹配任何Name 加上一些可能的数字?
  • 如果您对正则表达式不太擅长,我建议您避免使用这种方法。最好将字符串解析为 csv 列表并对其进行标记以获取名称。
  • @duffymo 不,我需要正则表达式敏捷性,已经找到了原因。不要气馁,除非你确定有更好的方法。 ://
  • 我确信有更好的方法。建议他们考虑不同的事情并不会阻止任何人。听说过这个吗? “你有问题。你决定使用正则表达式来解决它。现在你有两个问题。”它适用于“正则表达式不太好”的情况。

标签: java regex regex-lookarounds regex-group regex-greedy


【解决方案1】:

在这里,我们可以编写一个表达式来使用捕获组来涵盖这两种情况。也许类似于这样:

([})])?([A-Z][a-z]+)?([0-9]+)?(,\s)?([({])? 

测试

import java.util.regex.Matcher;
import java.util.regex.Pattern;

final String regex = "([\\})])?([A-Z][a-z]+)?([0-9]+)?(,\\s)?([(\\{])?";
final String string = "{Name1, Name2}\n"
     + "(Name1, Name2)";
final String subst = "\\2";

final Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE);
final Matcher matcher = pattern.matcher(string);

// The substituted value will be contained in the result variable
final String result = matcher.replaceAll(subst);

System.out.println("Substitution result: " + result);

演示

const regex = /([})])?([A-Z][a-z]+)?([0-9]+)?(,\s)?([({])?/gm;
const str = `{Name1, Name2}
(Name1, Name2)`;
const subst = `$2`;

// The substituted value will be contained in the result variable
const result = str.replace(regex, subst);

console.log('Substitution result: ', result);

正则表达式

如果不需要此表达式,可以在 regex101.com 中修改或更改它。例如,您可以减少边界并大大简化此表达式。

正则表达式电路

jex.im 也有助于将表达式可视化。

【讨论】:

  • 所有这些可选组的意义何在?比只搜索[A-Z][a-z]+ 有什么优势?
【解决方案2】:

找到了一种通过使用两个正则表达式来做到这一点的方法,一个也匹配整个事物,另一个首先使用这个 '\w+\s\S+?\s+\"([^\"]*)\" 将它们分开'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-29
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-08
    相关资源
    最近更新 更多