Java Regex - 使用单个美元捕获字符串,但当它有两个连续的美元时则不会

2024-01-30

我已经发布this https://stackoverflow.com/questions/58821727/java-regex-java-util-regex-search-for-dollar-sign早点问。

但这还没有结束。 那里适用的所有规则仍然适用。

所以字符串:

  • "%ABC%"结果会产生 ABC (捕获百分号之间的内容)
  • 一样"$ABC."(捕获 $ 之后的内容,当出现另一个美元或点时放弃)
  • "$ABC$XYZ"也会,并且也会给出 XYZ 作为结果。

对此添加更多内容:

  • "${ABC}"也应该产生 ABC 。 (如果存在的话,请忽略大括号 - 也许不是捕获字符?)。
  • 如果您有两个连续的美元符号,例如"$$EFG", or "$${EFG}",
    那应该not出现在正则表达式结果中。 (这就是编号或命名的反向引用发挥作用的地方 - 也是我将它们视为非捕获组的原因)。据我了解,使用此语法,一个组将成为一个非捕获组(?:).

1)我可以说 % 或 $ 是非捕获组并按数字引用吗?或者只有捕获组才能获得分配的编号?

2)编号的顺序是什么(如果有)((A) (B) (C))。外群是1、A 2、B 3 C 4 吗?

我一直在查看命名组。看到提到的语法here https://stackoverflow.com/a/415635/495157

(?<name>capturing text)定义一个命名组“name”

\k<name>反向引用命名组“名称”

3)不确定是否可以在Java中命名非捕获组?有人可以解释一下吗?

  • 更多信息这里关于非捕获组 https://www.javamex.com/tutorials/regular_expressions/non_capturing_groups.shtml.
  • 更多信息请参见此处回顾 https://www.logicbig.com/tutorials/core-java-tutorial/java-regular-expressions/regex-lookbehind.html
  • 类似问题的答案here https://stackoverflow.com/a/16717823/495157,但并没有完全得到我想要的东西。不确定 Java 中是否存在反向引用问题。
  • 类似问题here https://stackoverflow.com/questions/2734977/backreferences-in-lookbehind。但我无法理解适用于此的工作版本。

我使用了与我原来的问题中完全相同的 Java,除了:

String search = "/bla/$V_N.$$XYZ.bla";
String pattern = "(?:(?<oc>[%$]))(?!(\\k<oc>))([^%.$]*)+";

这应该只会导致V_N.

我真的很苦恼这个问题,想知道是否有人可以帮助我解决这个问题。谢谢。


您可以编写一些带有多个捕获组的更详细的正则表达式,并且只捕获那些不是的null,或者简单地连接找到的组值,因为每次匹配时总是只有其中一个被初始化:

%([^%.]+)%|(?<!\$)\$(?:\{([^{}]+)\}|([^$.]+))

See the 正则表达式演示 https://regex101.com/r/7Q6EAD/1.

Details

  • %([^%.]+)% - %,第 1 组:除% and .,那么一个%被消耗
  • | - or
  • (?<!\$)- 负向后查找,匹配字符串中不紧接前面的位置$
  • \$ - a $
  • (?: - start of the non-capturing container group matching either of:
    • \{([^{}]+)\} - {,第 2 组:除{ and }, then }被消耗
    • | - or
    • ([^$.]+)- 第 3 组:1 个或多个字符,除$ and .
  • )- 非捕获容器组的末尾。

Java的使用 https://ideone.com/kaKfBz:

String regex = "%([^%.]+)%|(?<!\\$)\\$(?:\\{([^\\{}]+)\\}|([^$.\\s]+))";
String string = "%ABC%\n$ABC.\n$ABC$XYZ  ${ABC}\n\n$$EFG $${EFG}.";
Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE);
Matcher m = pattern.matcher(string);
List<String> results = new ArrayList<>();
while (m.find()) {
    results.add(Objects.toString(m.group(1),"") + 
        Objects.toString(m.group(2),"") + 
        Objects.toString(m.group(3),""));
}
System.out.println(results); // => [ABC, ABC, ABC, XYZ, ABC]

请注意,在常规 Java 字符串文字中,\应该转义(即\\)来介绍一个literal用作一部分的反斜杠正则表达式转义.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java Regex - 使用单个美元捕获字符串,但当它有两个连续的美元时则不会 的相关文章

  • 如何以编程方式使用包含多列的 where-in 子句执行 PostgreSQL 查询?

    我的查询是这样的 select from plat customs complex where code t code s in 01013090 10 01029010 90 它在 psql 控制台中运行良好 我的问题是如何在客户端代码中
  • Java LostFocus 和 InputVerifier,按反向制表符顺序移动

    我有一个 GUI 应用程序 它使用 InputVerifier 在产生焦点之前检查文本字段的内容 这都是很正常的 然而 昨天发现了一个问题 这似乎是一个错误 但我在任何地方都找不到任何提及它的地方 在我将其报告为错误之前 我想我应该问 我在
  • 我对线程失去了理智

    我想要这个类的对象 public class Chromosome implements Runnable Comparable
  • java中如何知道一条sql语句是否执行了?

    我想知道这个删除语句是否真的删除了一些东西 下面的代码总是执行 else 是否删除了某些内容 执行此操作的正确方法是什么 public Deleter String pname String pword try PreparedStatem
  • 使用 OkHttp 下载损坏的文件

    我编写的下载文件的方法总是会产生损坏的文件 public static String okDownloadToFileSync final String link final String fileName final boolean te
  • JAXB - 忽略元素

    有什么方法可以忽略 Jaxb 解析中的元素吗 我有一个很大的 XML 文件 如果我可以忽略其中一个大而复杂的元素 那么它的解析速度可能会快很多 如果它根本无法验证元素内容并解析文档的其余部分 即使该元素不正确 那就更好了 例如 这应该只生成
  • 在 Spring 中为 @Pathvariable 添加类级别验证

    在发布这个问题之前 我已经做了很多研究并尝试了很多可用的解决方案 这是我陷入的棘手情况 我有一个 Spring 控制器 它有多个请求映射 它们都有 PathVariables 控制器如下所示 Controller EnableWebMvc
  • 在java程序中使用c++ Dll

    我正在尝试使用System LoadLibrary 使用我用 C 编写的一个简单的 dll UseDllInJava java import com sun jna Library import com sun jna Native imp
  • UseCompressedOops JVM 标志有什么作用以及何时应该使用它?

    HotSpot JVM 标志是什么 XX UseCompressedOops我应该做什么以及什么时候使用它 在 64 位 Java 实例上使用它 与不使用它 时 我会看到什么样的性能和内存使用差异 去年大多数 HotSpot JVM 都默认
  • 类更改(例如字段添加或删除)是否保持 Serialized 的向后兼容性?

    我有一个关于 Java 序列化的问题 在这种情况下 您可能需要修改可序列化类并保持向后兼容性 我有丰富的 C 经验 所以请允许我将 Java 与 NET 进行比较 在我的Java场景中 我需要使用Java的运行时序列化机制序列化一个对象 并
  • Joshua Bloch 的构建器设计模式有何改进?

    早在 2007 年 我就读过一篇关于 Joshua Blochs 所采用的 构建器模式 的文章 以及如何修改它以改善构造函数和 setter 的过度使用 特别是当对象具有大量属性 其中大部分属性是可选的 时 本文对此设计模式进行了简要总结
  • 如何向页面添加 HTML 页眉和页脚?

    如何使用 itext 从 html 源添加标题到 pdf 目前 我们已经扩展了 PdfPageEventHelper 并重写了这些方法 工作正常 但当我到达 2 个以上页面时 它会抛出 RuntimeWorkerException Over
  • Tomcat 6 未从 WEB-INF/lib 加载 jar

    我正在尝试找出我的 tomcat 环境中的配置问题 我们的生产服务器正在运行 tomcat 安装并从共享 NFS 挂载读取战争 然而 当我尝试使用独立的盒子 及其配置 进行同样的战争时 我收到下面发布的错误 有趣的是 如果我将 WEB IN
  • Lombok 不适用于 Eclipse Neon

    我下载了lombok jar lombok 1 16 14 jar 并将其放入我的下载中 然后我点击这个 jar 执行正确地识别了我的 MacOS 上的 Eclipse 实例 然后我选择了我想要的实例 Lombok也在pom xml中指定
  • Azure Java SDK:ServiceException:ForbiddenError:

    尝试了基本位置检索器代码 如下所示 String uri https management core windows net String subscriptionId XXXXXXXX 5fad XXXXXX 9dfa XXXXXX St
  • Android计算两个日期之间的天数

    我编写了以下代码来查找两个日期之间的天数 startDateValue new Date startDate endDateValue new Date endDate long diff endDateValue getTime star
  • Android ScrollView,检查当前是否滚动

    有没有办法检查标准 ScrollView 当前是否正在滚动 方向是向上还是向下并不重要 我只需要检查它当前是否正在滚动 ScrollView当前形式不提供用于检测滚动事件的回调 有两种解决方法可用 1 Use a ListView并实施On
  • 确定 JavaFX 中是否消耗了事件

    我正在尝试使用 JavaFX 中的事件处理来做一些非滑雪道的事情 我需要能够确定手动触发事件后是否已消耗该事件 在以下示例中 正确接收了合成鼠标事件 但调用 Consumer 不会更新该事件 我对此进行了调试 发现 JavaFX 实际上创建
  • JavaScript 正则表达式两个标签之间的多行文本

    我编写了一个正则表达式来从 HTML 中获取字符串 但似乎多行标志不起作用 这是我的模式 我想将文本输入h1 tag var pattern div class box content 5 h1 lt lt h1 gt mi m html
  • Angular 2:使用正则表达式进行数字验证

    我正在尝试验证 IE 11 中的数字字段

随机推荐