- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在开发一个参数解析器,它将接受参数的 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 character
、 regex ignore start of string
和 regular expression escape if not preceded by anything
等查询进行了数小时的 Google 搜索(均无济于事)后,我决定向你们寻求帮助。所以,这是我的问题:
是否可以在环视中表示字符串的结尾和开头?(或者,空字符也可以。)
我已经尝试过 ^
、 $
和 \b
字符,以便我的表达式看起来像 (?<!(^|\b|\\))\\(?=($|\b| ))
,但这没有效果。 (我也尝试过使用空文字,例如 (?<!(|\\))\\(?=(| ))
。)
非常非常感谢任何帮助。预先感谢!
最佳答案
您不能使用$
或^
在环视中,因为:
$
和^
并不是真正可以匹配的东西,它们本身也只是断言(断言我们处于结束(分别:输入的开始))。因此,您甚至可以将它们视为简单的特定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/
我想处理 vector 中的元素一段时间。为了优化这一点,我不想在处理项目时删除它,而是在最后删除所有已处理的项目。 vector::iterator it; for(it = items.begin
我对 perl 中的 const 声明有疑问,并且无法弄清楚差异,请指出有什么不同。 下面是代码: BEGIN { *SIZE = sub() { 2 }; } *ITEM = sub() {
在右值上调用std::vector 和std::begin() 的成员函数.begin() 会导致不同的输出, 如以下测试所示: vector a{ 1, 2, 3 }; vector::iterat
我正在尝试创建自己的 vector 类。目前,我正在为我的 vector 类 Vec 添加一个删除函数。当我将 variable.begin() 传递到 erase 函数参数时,我的代码会报错,但在我
在 c++ 中迭代 vector 时,我注意到标准库中有一个 begin() 函数,还有一个 begin() 作为成员函数vector 类。如果有的话,两者之间有什么区别,应该使用哪个而不是另一个?
为什么标准将 end() 定义为末尾,而不是实际末尾? 最佳答案 最好的论据是Dijkstra himself 提出的论据。 : 您希望范围的大小是一个简单的差异end - begin; 当序列退化为
我正在尝试遍历大量记录并处理它们中的每一个。即使在处理过程中发生错误,游标也应该继续循环遍历记录,但在批处理结束时,我希望看到所有产生错误的记录的错误消息。 我有以下代码: 选择.... OP
这个问题在这里已经有了答案: error: no matching function for call to 'begin(int*&)' c++ (3 个答案) 关闭 6 年前。 我想获取数组的长
如果我有 std::vector(它是一个 std::vector 并且永远是一个 std::vector)。 使用 std::begin() 代替 std::vector::begin()(或相反)
这个问题在这里已经有了答案: Why use non-member begin and end functions in C++11? (7 个答案) 关闭 4 年前。 在这个问题(https://
我一直在尝试在网络上查找有关这些陈述之间差异的信息,在我看来它们是相同的,但我找不到对此的确认或两者之间的任何类型的比较。 这样做有什么区别: BEGIN -- Some update, in
我正在使用 Tiled Map 学习 LibGDX。我遇到了以下两种渲染方法。第一个是我通常使用的简单的。 但是,我不明白为什么我们需要第二个。我可以使用 batch.begin();在方法 2 中也
是否可以在 SpriteBatch begin 和 end 调用之间使用 ShapeRenderer 绘制形状。 我已经尝试过但没有结果,只绘制了 SpriteBatch 纹理,场景中没有任何形状。示
嗨,我正在编写一个程序,该程序从 .pem 文件导入私钥并创建一个私钥对象以供稍后使用。我遇到的问题是一些 pem 文件头以 开头 -----BEGIN PRIVATE KEY----- 而其他人则以
关闭。这个问题是off-topic .它目前不接受答案。 想改善这个问题吗? Update the question所以它是 on-topic对于堆栈溢出。 9年前关闭。 Improve this q
观看 Stephan T. Lavavej:核心 C++ #1,并注意到他使用的是 begin(collection) 而不是 collection.begin()。 有什么优势? 最佳答案 我想到的
Python脚本 ''' a ''' from __future__ import print_function 运行良好(即什么都不做),但是 ''' a ''' ''' b ''' from __
如何在两种风格的公钥格式之间进行转换, 一种格式是: -----BEGIN PUBLIC KEY----- ... -----END PUBLIC KEY----- 另一种格式是: -----BEGI
我是 STL c++ 的新手。我从书中复制了这个函数: string ConverToLowerCase(string s) { transform(s.begin(), s.end(),
给定代码: #include #include #include #include using namespace std; int main() { string s("ABCDE
我是一名优秀的程序员,十分优秀!