正则表达式麻烦,转义引号

2024-03-21

基本上,我正在传递一个字符串,我需要以与 *nix shell 标记命令行选项大致相同的方式对其进行标记

假设我有以下字符串

"Hello\" World" "Hello Universe" Hi

我怎样才能把它变成一个三元素列表

  • 你好世界
  • 你好宇宙
  • Hi

以下是我的第一次尝试,但有很多问题

  • 它留下了引号字符
  • 它没有捕获转义的引用

Code:

public void test() {
    String str = "\"Hello\\\" World\" \"Hello Universe\" Hi";
    List<String> list = split(str);
}

public static List<String> split(String str) {
    Pattern pattern = Pattern.compile(
        "\"[^\"]*\"" + /* double quoted token*/
        "|'[^']*'" + /*single quoted token*/
        "|[A-Za-z']+" /*everything else*/
    );

    List<String> opts = new ArrayList<String>();
    Scanner scanner = new Scanner(str).useDelimiter(pattern);

    String token;
    while ((token = scanner.findInLine(pattern)) != null) {
        opts.add(token);
    }
    return opts;
}

所以下面代码的错误输出是

  • "Hello\"
  • World
  • " "
  • Hello
  • Universe
  • Hi

EDIT我完全愿意接受非正则表达式解决方案。这只是我想到的第一个解决方案


如果您决定放弃正则表达式并进行解析,则有几种选择。如果您愿意只使用双引号或单引号(但不能同时使用两者)作为引用,那么您可以使用 StreamTokenizer 轻松解决此问题:

public static List<String> tokenize(String s) throws IOException {
    List<String> opts = new ArrayList<String>();
    StreamTokenizer st = new StreamTokenizer(new StringReader(s));
    st.quoteChar('\"');
    while (st.nextToken() != StreamTokenizer.TT_EOF) {
        opts.add(st.sval);
    }

    return opts;
}

如果您必须支持两个引号,这里有一个应该可行的简单实现(请注意,像 '"blah \" blah"blah' 这样的字符串将产生类似 'blah " blahblah' 的内容。如果这不行,您将需要进行一些更改):

   public static List<String> splitSSV(String in) throws IOException {
        ArrayList<String> out = new ArrayList<String>();

        StringReader r = new StringReader(in);
        StringBuilder b = new StringBuilder();
        int inQuote = -1;
        boolean escape = false;
        int c;
        // read each character
        while ((c = r.read()) != -1) {
            if (escape) {  // if the previous char is escape, add the current char
                b.append((char)c);
                escape = false;
                continue;
            }
            switch (c) {
            case '\\':   // deal with escape char
                escape = true;
                break;
            case '\"':
            case '\'':  // deal with quote chars
                if (c == '\"' || c == '\'') {
                    if (inQuote == -1) {  // not in a quote
                        inQuote = c;  // now we are
                    } else {
                        inQuote = -1;  // we were in a quote and now we aren't
                    }
                }
                break;
            case ' ':
                if (inQuote == -1) {  // if we aren't in a quote, then add token to list
                    out.add(b.toString());
                    b.setLength(0);
                } else {
                    b.append((char)c); // else append space to current token
                }
                break;
            default:
                b.append((char)c);  // append all other chars to current token
            }
        }
        if (b.length() > 0) {
            out.add(b.toString()); // add final token to list
        }
        return out;
    }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

正则表达式麻烦,转义引号 的相关文章

  • JavaEE 8 教程,在 hello1 项目上部署失败

    我正在尝试学习 Java EE 8 我遵循了官方指南https javaee github io tutorial https javaee github io tutorial 但我有这个问题 cargo maven2 plugin 1
  • 以编程方式将 PEM 证书导入 Java KeyStore

    我有一个由两个文件 crt 和 key 组成的客户端证书 我希望将其导入到 java KeyStore 中 然后在 SSLContext 中使用 以通过 Apache 的 HTTPClient 发送 HTTP 请求 但是 我似乎找不到一种以
  • 使用多个构造函数创建不可变类

    我正在阅读这一页 https docs oracle com javase tutorial essential concurrency imstrat html关于在 Java 中创建不可变类 并决定根据页面上概述的规范修改我正在编写的类
  • 如何将命令行参数传递给 rake 任务

    我有一个 rake 任务需要将一个值插入到多个数据库中 我想从命令行或从another耙任务 我怎样才能做到这一点 您可以通过向任务调用添加符号参数来指定 rake 中的形式参数 例如 require rake task my task a
  • Maven + Cobertura:无法找到[您的班级]。你指定了源目录吗?

    我有 MyMath 类 有两个简单的方法 multi 和 add 和测试类只会测试多种方法 public class MainTest Test public void testMultiply MyMath tester new MyMa
  • 如何在具有动态列的表中插入值 Jdbc/Mysql

    我想在具有动态列的表中添加值 我设法创建一个包含动态列的表 但我不知道如何插入数据 Create Table sql CREATE TABLE MyDB myTable level INTEGER 255 int columnNumber
  • getClassLoader().getResource() 返回 null

    我有这个测试应用程序 import java applet import java awt import java net URL public class Test extends Applet public void init URL
  • LibGdx 如何使用 OrthographicCamera 滚动?

    我已经找了 10 个小时 字面意思 我已经完成了 我需要问一下 事情是我正在学习如何使用 LibGdx 来编写 Java 游戏 我正在做一个水平太空飞船游戏 所以 我最糟糕的问题是我不知道如何滚动 我认为绘制会更好地解释 我想绘制一个巨大的
  • 您能让 Tomcat 6 stdout.log 文件表现得像 log4j DailyRollingFileAppender 吗?

    我们使用的是 Tomcat 6 的 Windows 安装 默认情况下 我们应用程序的 log4j 输出将转到 catalina base logs stdout log 文件 该日志文件仅在我们重新启动 Tomcat 时滚动 并且文件名始终
  • grails 上的同步块在 Windows 上有效,但在 Linux 上无效

    我有一个 grails 应用程序 它依赖于服务中的同步块 当我在 Windows 上运行它时 同步按预期工作 但当我在 ams linux 上运行时 会出现 StaleObjectStateException 该问题在以下示例中重现 cla
  • java 属性文件作为枚举

    是否可以将属性文件转换为枚举 我有一个包含很多设置的属性文件 例如 equipment height equipment widht equipment depth and many more like this and not all a
  • 通用 JSF 实体转换器[重复]

    这个问题在这里已经有答案了 我正在编写我的第一个 Java EE 6 Web 应用程序作为学习练习 我没有使用框架 只是使用 JPA 2 0 EJB 3 1 和 JSF 2 0 我有一个自定义转换器 用于将存储在 SelectOne 组件中
  • @TestPropertySource 不适用于 Spring 1.2.6 中使用 AnnotationConfigContextLoader 的 JUnit 测试

    似乎我在 Spring 4 1 17 中使用 Spring Boot 1 2 6 RELEASE 所做的任何事情都不起作用 我只想访问应用程序属性并在必要时通过测试覆盖它们 无需使用 hack 手动注入 PropertySource 这不行
  • 用 Java 创建迷宫求解算法

    我被分配了用 Java 创建迷宫求解器的任务 这是任务 Write an application that finds a path through a maze The maze should be read from a file A
  • 是什么原因导致“对象不是声明类的实例”? [复制]

    这个问题在这里已经有答案了 可能的重复 使用反射调用方法时 为什么会出现 对象不是声明类的实例 https stackoverflow com questions 7202988 why do i get object is not an
  • Mule/码头设置

    我有一个正在运行的 Mule 应用程序 我想在其上设置 Jetty 来响应 http 请求 以下配置
  • 防止 Firebase 中的待处理写入事务不起作用

    我的目标是在单击按钮时将名称插入 Cloud Firestore 中 但如果用户未连接到互联网 我不希望保存处于挂起状态 我不喜欢 Firebase 保存待处理写入的行为 即使互联网连接已恢复 我研究发现Firebase 开发人员建议使用事
  • 日期时间解析异常

    解析日期时 我的代码中不断出现异常错误 日期看起来像这样 Wed May 21 00 00 00 EDT 2008 这是尝试读取它的代码 DateTimeFormatter formatter DateTimeFormatter ofPat
  • Java 9 中紧凑字符串和压缩字符串的区别

    有什么优点紧凑的字符串 http openjdk java net jeps 254JDK9 中的压缩字符串 压缩字符串 Java 6 和紧凑字符串 Java 9 都有相同的动机 字符串通常实际上是 Latin 1 因此浪费了一半的空间 和
  • 如何使用 Spring AOP 建议静态方法?

    在执行类的静态方法之前和之后需要完成一些日志记录 我尝试使用 Spring AOP 来实现这一点 但它不起作用 而对于正常方法来说它起作用 请帮助我理解如何实现这一点 如果可以使用注释来完成 那就太好了 也许您应该在使用 Spring AO

随机推荐

  • 在Java中生成泊松到达

    我想在Java中创建一个函数 在给定平均到达率 lambda 和平均服务率 mu 的情况下生成泊松到达 在我的示例中 每天有 2 2 个请求 换句话说 每天有 2 2 个到达 平均服务时间为 108 小时 考虑到我的程序在 t 0 分钟开始
  • 如何使 C# Windows 运行时组件类型相等?

    我正在用 C 编写一个 Windows 运行时组件 我想在我的一些类型中实现 IEquatable 接口 我不需要向组件的使用者公开 Equals 方法 我只是希望我的单元测试能够在实例之间进行比较 不允许实现 IEquatable 因为它
  • “As Dictionary”和“As Scripting.Dictionary”是否等效(对于 VBA 早期绑定)?

    使用早期绑定和 Microsoft 脚本运行时库创建字典对象时 同一事物似乎有 2 个等效的类型名称 Dim dict as Dictionary Set dict New Dictionary and Dim dict as Script
  • 性能:具有多次调用的全局和局部声明

    为什么R中无论在哪里声明函数 两者性能几乎相同 library microbenchmark f1 lt function lapply 1 100000 function x fun lt function 1 10000 fun f2
  • 合并两个表并为 R 中的每个表添加标题

    我想并排显示两个回归分析的结果 比如说逻辑回归和 COX 回归 变量以行形式呈现 p OR HR 和置信区间的相应数据以列形式呈现 因此 列名称不匹配 OR 位于左侧 HR 位于右侧 我尝试了 cbind 但遇到了以下问题 1 如果由于变量
  • 如何使用最小起订量模拟将项目添加到存储库或 DbContext?

    我见过的对存储库使用最小起订量的示例仅展示了如何模拟返回的内容 我有一个有点奇怪的要求 当执行查询时 如果条件存在 则应将某个项目添加到存储库中 我想知道如何在不查询数据库的情况下测试它 我知道如何模拟现有条件 但是如何设置模拟以便可以测试
  • 如何在 tkinter 文本小部件中突出显示文本

    我想知道如何根据某些模式改变某些单词和表达方式的风格 我正在使用Tkinter Textwidget 我不知道如何做这样的事情 与文本编辑器中语法突出显示的想法相同 我不确定这是否是用于此目的的正确小部件 它是用于这些目的的正确小部件 基本
  • Django Rest框架批量创建

    我正在尝试制作一个 api 您可以使用 django Rest 框架通过单个 Post 请求创建多个对象 但是 我的序列化器提供了一个我不明白的错误 首先这是我的代码的骨架 我的序列化器 class MyModelSerializer se
  • MIPS——这重要吗? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我的问题 了解 MIPS 编程语言有用吗 我是一名计算机科学学生 正在上一门以 MIPS 为重点的汇编课程 我很擅长使用高级语言进行编写 但 M
  • 类型错误:不是构造函数

    我只是将代码用作有关 JavaScript 类的学习练习 该代码产生 TypeError SimpleLogger 不是构造函数 该类似乎已导出 但我无法在 main js 文件中实例化它 我已经减少了代码以仅显示问题 我想知道是否有人能发
  • 从 ant 类路径中排除 jar

    我正在尝试在一些使用 ant 脚本的遗留项目上进行 干净的 Maven 设置 我对蚂蚁了解不多 所以我的问题可能显得很幼稚 我快完成了 但是由于类路径中存在冗余 交付蚂蚁脚本失败了 如果我理解构建 这些行应该添加到 提供 范围内每个库的类路
  • 多个构造函数与 Structuremap 改变范围?

    为了说明问题 这是我的设置的简化版本 我有一家这样的工厂 public interface IFactory public class Factory IFactory public Factory Console WriteLine pa
  • 同一 AWS Cognito 用户池中的多个应用程序对于同一用户来说 cognitoID 是否相同?

    我有一个 Cognito 用户池 可以与我的 iOS 和 Android 应用程序配合良好 该池有一个客户端密钥 我现在想建立网络身份验证 Cognito 的 javascript sdk 不支持使用应用程序客户端密钥配置的用户池 假设我在
  • Google 的 Vision Api protobuf 对 Python 字典的响应对象

    我正在开发一个项目 需要使用 Google 的 Vision API 分析图像并将响应发布到 Dynamodb 表 我已经成功实现了 Vision API 但无法将其响应转换为 Python 字典 这是我尝试过的 if form is va
  • Pandas DF 有一列包含列表。如何使用此列表的每个值重复行?

    我有一个像这样的熊猫数据框 title author year type 0 t1 a1 1980 article 1 t2 a2 a3 a4 1983 article 2 t3 a5 1982 article 3 t4 a6 1977 a
  • jQuery 验证中的正则表达式 - jQuery 中的单引号问题

    我有一个正则表达式来验证密码是否包含数字 小写和大写字符 下面这个效果很好 但是当我在 jQuery 验证中使用它时 txtPassword required true regex Regex Regex 8 16 d a z A Z am
  • 如何使用脚本重新创建 IPython 的“--pylab”选项的效果?

    我想创建一个与 IPython 执行相同操作的配置文件 pylab 用手 标记 为了实现这一目标 脚本的内容应该是什么 包导入 名称空间指定 设置等 作为替代方案 我还想知道是否有一种方法可以检查 pylab当前 IPython 会话启动时
  • 什么是 ls -F (ls --classify) [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 看着普通旧版的手册页ls http linux die net man 1 ls我看到有一个标志 F F classify append
  • Int 转换不起作用[重复]

    这个问题在这里已经有答案了 我正在为我的游戏创建高分功能 但无法让它发挥作用 这是我的方法 def game over self Game over Screen keys pygame key get pressed self gameo
  • 正则表达式麻烦,转义引号

    基本上 我正在传递一个字符串 我需要以与 nix shell 标记命令行选项大致相同的方式对其进行标记 假设我有以下字符串 Hello World Hello Universe Hi 我怎样才能把它变成一个三元素列表 你好世界 你好宇宙 H