【问题标题】:How to use regex for a single character in a String?如何对字符串中的单个字符使用正则表达式?
【发布时间】:2016-07-14 12:17:00
【问题描述】:

我有以下字符串:

LoopStep(i,0,m-1,1) 

我想使用正则表达式,这样我就可以找到第一个“(”,例如我的正则表达式代码是:\\([^)]*\\)。我只想检查第一个左括号,所以我没有问题使用此代码:

LoopStep ((i,0,m-1,1)).

【问题讨论】:

  • 如果你只想找到第一个(的位置然后使用String类的indexOf方法,你不需要正则表达式来做这么简单的事情:@987654328 @
  • 为什么需要正则表达式? indexOf
  • 你不用引号?
  • 那么我必须检查 LoopStep 之后是否会有一个打开的括号,以及字符串是否以一个闭合的括号结尾
  • 只是想知道——他是否真的想要允许任何“好的”组合,比如 ( )、(( ))、((( ))) 等等;这种“计数”可以用正则表达式完成吗?或者你真的需要一个编译器吗?

标签: java regex string-matching


【解决方案1】:

如果您只是想检查您的String 是否不包含两个连续的括号,您可以使用indexOfcontains 代替正则表达式:

// will return true only if the String doesn't contain ((
// you can also use to infer actual index
test.indexOf("((") == -1
// same and better but you can't use the index
!test.contains("((")

请注意,test 是您想要的 String 变量,例如值为"LoopStep(i,0,m-1,1)"

如果您实际上是在解析语法(看起来确实如此),请不要使用正则表达式。

您可能必须构建自己的解析器来验证和解析元语言的语法。

注意

只是为了让您了解如果您在这种情况下使用正则表达式来验证语法,您可能会遇到什么混乱,这里有一个正则表达式示例匹配您的整个 String 以检查连续括号 ("((") :

//           | non-parenthesis
//           |    | or
//           |    | | not preceded by parenthesis
//           |    | |      | actual parenthesis
//           |    | |      |  | not followed by parenthesis
//           |    | |      |  |       | 1+ length(adjust with desired quantifier)
test.matches("([^(]|(?<!\\()\\((?!=\\())+")

【讨论】:

    【解决方案2】:

    您可以使用问号。如果将其添加到正则表达式中,它将变得非贪婪。例如,模式 "(" 将匹配你所有的开括号,同时 "(?" 将只匹配第一次出现。

    【讨论】:

    • 最后一个呢?我试过用 \Z 但由于某种原因它不起作用
    • 要匹配第一个右括号还是最后一个?
    • 我需要检查他们两个,如果LoopStep后面是“(”并且它以“)”结尾
    • 然后将此条件添加到您的问题中
    • 我不确定我是否理解您的问题。你不能只使用 (.*) 作为模式吗?这将匹配 OP 中的 this (i,0,m-1,1) 和 this ((i,0,m-1,1))。然后,如果匹配,您将确定括号在那里。在这里试试:regex101.com
    猜你喜欢
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-08
    • 2017-09-08
    • 2019-10-14
    相关资源
    最近更新 更多