【问题标题】:Regex that matches before and after certain characters在某些字符之前和之后匹配的正则表达式
【发布时间】:2021-01-05 09:35:30
【问题描述】:

我正在尝试制作一个分隔符正则表达式(用于 java.util.Scanner),它在空格上分割字符串,并保留冒号、左括号和右括号作为单独的标记。也就是说,foo(a:b) 应该分割成标记 foo(a:b)

我目前的最大努力是模式"\\s+|(?=[(:])|(?<=[:)])",由于某种我无法理解的原因,它在左括号之后和右括号之前无法匹配,但在冒号的两边都匹配得很好。

【问题讨论】:

  • 试试\s+|(?=[():])|(?<=[:(]) regex101.com/r/9pSfWr/1
  • 看来你只需要在字符类中包含两个括号,"\\s+|(?=[():])|(?<=[:()])"

标签: java regex regex-lookarounds


【解决方案1】:

如果您想要所有这些单独的部分,您可以扩展字符类,在左侧断言字符之一 [(:)],如果这是整个字符串,则在右侧断言字符之一 [(:]

如果还想匹配最后一个右括号后的位置,两个字符类可以相同[(:)]

\s+|(?=[(:)])|(?<=[(:])

Regex demo | Java demo

示例代码

String s = "foo(a:b)";
Scanner scanner = new Scanner(s).useDelimiter("\\s+|(?=[(:)])|(?<=[(:])");
while(scanner.hasNext())
{
    System.out.println(scanner.next());
}

输出

foo
(
a
:
b
)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-15
    • 1970-01-01
    • 2019-05-09
    • 1970-01-01
    • 1970-01-01
    • 2019-01-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多