当前位置: 首页 > 面试题库 >

Java 用于在不被单引号或双引号包围时使用空格拆分字符串的正则表达式

上官英哲
2023-03-14
问题内容

我是正则表达式的新手,非常感谢您的帮助。我正在尝试将一个表达式合并在一起,以使用不被单引号或双引号引起来的所有空格拆分示例字符串。我的最后一次尝试看起来像这样:(?!”)并且效果不佳。它在报价前的空格处分开。

输入示例:

This is a string that "will be" highlighted when your 'regular expression' matches something.

所需的输出:

This
is
a
string
that
will be
highlighted
when
your
regular expression
matches
something.

注意"will be"'regular expression'保留单词之间的空格。


问题答案:

我不明白为什么其他所有人都提出如此复杂的正则表达式或如此长的代码。本质上,你想从字符串中获取两种东西:不是空格或引号的字符序列,以及两种引号之间以引号开头和结尾且中间没有引号的字符序列。你可以使用以下正则表达式轻松匹配这些内容:

[^\s"']+|"([^"]*)"|'([^']*)'

我添加了捕获组,因为你不需要列表中的引号。

此Java代码构建列表,如果匹配则将捕获组添加到引号中,如果捕获组不匹配(匹配未引用的单词),则添加总体正则表达式匹配。

List<String> matchList = new ArrayList<String>();
Pattern regex = Pattern.compile("[^\\s\"']+|\"([^\"]*)\"|'([^']*)'");
Matcher regexMatcher = regex.matcher(subjectString);
while (regexMatcher.find()) {
    if (regexMatcher.group(1) != null) {
        // Add double-quoted string without the quotes
        matchList.add(regexMatcher.group(1));
    } else if (regexMatcher.group(2) != null) {
        // Add single-quoted string without the quotes
        matchList.add(regexMatcher.group(2));
    } else {
        // Add unquoted word
        matchList.add(regexMatcher.group());
    }
} 

如果你不介意在返回列表中使用引号,则可以使用更简单的代码:

List<String> matchList = new ArrayList<String>();
Pattern regex = Pattern.compile("[^\\s\"']+|\"[^\"]*\"|'[^']*'");
Matcher regexMatcher = regex.matcher(subjectString);
while (regexMatcher.find()) {
    matchList.add(regexMatcher.group());
} 


 类似资料:
  • 问题内容: 我写了一个正则表达式,用double-qoutes分割字符串: 如何将其扩展为与单双qoutes一起使用? 我试过了: 但这是行不通的 问题答案: 有两种方法:

  • 我正在编写一个正则表达式来解析包含标记字段的行。标签出现在等号之前,内容出现在等号之后,用单引号或双引号括起来。对于大多数字段,内容都用单引号括起来。如果字段的内容包含单引号,则该字段用双引号括起来。例如: 我的正则表达式有效,除非字段用双引号括起来。 在Debuggex中测试 在Regexr中测试 对于上面示例中标记为a的字段,a=“'D08/APPL'”,a由捕获组1匹配,后面的单引号由捕获组

  • 问题内容: 我有一个输入字符串 这个或“那个或”或“这个或那个” 应该翻译成 这个|| “那个或” || “这个或那个” 因此,尝试是在一个字符串中查找一个字符串(或)的出现并将其替换为另一个字符串(||)。我尝试了以下代码 输出是 这个|| “那个或” || ‘这个|| 那’ 问题是单引号内的字符串也被替换了。至于代码,样式仅是示例。当我开始工作时,我将编译模式并重用它。 问题答案: 试试这个正

  • 这是我之前问题的后续。我意识到我需要更具体地说明我的regex案例,以获得适用于我的案例的答案。 我已经与这个正则表达式斗争了很长一段时间(也使用我上一个问题的答案),我似乎无法构建我需要的东西。 我需要将所有字符串中出现的两个重复出现的单引号替换为(因此字符串内部意味着单引号)。这是因为在一种语言(语法)中,字符串中的引号使用<code>‘转义。 这里有一个例子(实际的例子可以包含用< code

  • 我有一个应用程序收到一个格式错误的JSON字符串,如下所示: null 也可能是格式错误的JSON字符串: 在本例中,不应替换消息值中的单引号。

  • 有没有一种方法使组的“capture”可以在regex后面引用,但其捕获的值不在匹配列表中返回? 或者其他一些方法来解决我(看似简单)的问题。