gpt4 book ai didi

java - 字符串#replaceAll() : Representing the end or beginning of a string in look-arounds?

转载 作者:行者123 更新时间:2023-12-01 12:48:19 25 4
gpt4 key购买 nike

我正在开发一个参数解析器,它将接受参数的 String[] 并将其转换为我正在处理的程序可用的输出。参数由空格分隔,因此在文本 here are some arguments 中,每个单词都是一个单独的参数。但是,我认为用户可能需要将单词分组在一起,因此我在单词末尾以反斜杠的形式添加此功能。

此外,由于程序将参数作为映射读取,并使用关键字链接值(想想像 --password 123456 这样的命令行标志,它可以出现在命令中的任何位置),因此需要一种转义参数的方法, ,为了保持一致性,我制作了 \<arg> 。这意味着删除反斜杠的正则表达式应该忽略字符串开头的反斜杠。

另一件需要考虑的事情是能够用另一个反斜杠转义分组反斜杠。这意味着不应删除另一个反斜杠后面的任何反斜杠。例如,two\\ arguments 变成一个以 two\arguments 为元素的数组。

最后,我想保留单词中间的反斜杠不变。这意味着正则表达式应删除字符串末尾或后跟空格的反斜杠。

有了这些规则,

  • these\ are\ together 将成为一个参数,去掉反斜杠;
  • back\slash 将保持原样;
  • \test\\ 将变为 \test\ ;和
  • \test 将保持原样。

我目前正在使用环视来实现我想要的效果:

String[] args = input.split("(?<!(?<!\\\\)\\\\) ");

for (int i = 0; i < args.length; ++i)
args[i] = args[i].replaceAll("(?<!\\\\)\\\\(?= )", "");

最初,我使用表达式 '(?<!(?<!\\)\\) '(不带撇号)分割参数,从而进行分组。现在解析器继续剥离反斜杠,这是上述表达式无法处理的任务。

这导致正则表达式 (?<!\\)\\(?= ) 。一般来说,当这个表达式在 String#replaceAll("(?<!\\\\)\\\\(?= )", "") 中使用时,可以达到一些想要的效果:

  • these\ are\ together 变为 these are together ;和
  • back\slash 保持原样。

但是,一旦在字符串的开头或结尾找到反斜杠,这个表达式就会出现问题。例如, \test\\ 被错误地解析为 test\\ ,因为第一个反斜杠前面没有另一个反斜杠,并且最后一个反斜杠后面没有空格。在使用 regular expression represent empty characterregex ignore start of stringregular expression escape if not preceded by anything 等查询进行了数小时的 Google 搜索(均无济于事)后,我决定向你们寻求帮助。所以,这是我的问题:

是否可以在环视中表示字符串的结尾和开头?(或者,空字符也可以。)

我已经尝试过 ^$\b 字符,以便我的表达式看起来像 (?<!(^|\b|\\))\\(?=($|\b| )) ,但这没有效果。 (我也尝试过使用空文字,例如 (?<!(|\\))\\(?=(| )) 。)

非常非常感谢任何帮助。预先感谢!

最佳答案

您不能使用$^环视中,因为:

  • lookarounds 实际上是在尝试断言我们可以匹配某些模式,无论是在当前位置之前还是之后,同时:
  • $^并不是真正可以匹配的东西,它们本身也只是断言(断言我们处于结束(分别:输入的开始))。

因此,您甚至可以将它们视为简单的特定lookarounds(?<=^)简单地写成^(?=$)$ .

就您而言,您应该简单地处理 \ 的情况。通过检查附加条件 \\$ 位于行尾在你的正则表达式中,它变成:

((?<!\\)\\(?= )|\\$)

...或者,作为Java String :((?<!\\\\)\\\\(?= )|\\\\$)

查看工作示例 here on regex101 .

关于java - 字符串#replaceAll() : Representing the end or beginning of a string in look-arounds?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24466565/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com