如何删除不平衡/不成对的双引号(在 Java 中)

2024-01-14

我想把这个相对聪明的问题分享给这里的大家。 我正在尝试从字符串中删除不平衡/不配对的双引号。

我的工作正在进行中,我可能即将找到解决方案。但是,我还没有找到可行的解决方案。我无法从字符串中删除未配对/未配对的双引号。

输入示例

string1=injunct! alter ego."
string2=successor "alter ego" single employer"  "proceeding "citation assets"

输出应该是

string1=injunct! alter ego.
string2=successor "alter ego" single employer  proceeding "citation assets"

这个问题听起来类似于使用 Java 删除不平衡/不配对的括号 https://stackoverflow.com/questions/9898455/using-java-remove-unbalanced-unpartnered-paranthesis

这是到目前为止我的代码(它不会删除所有不成对的双引号)

private String removeUnattachedDoubleQuotes(String stringWithDoubleQuotes) {
    String firstPass = "";

    String openingQuotePattern = "\\\"[a-z0-9\\p{Punct}]";
    String closingQuotePattern = "[a-z0-9\\p{Punct}]\\\"";

    int doubleQuoteLevel = 0;
    for (int i = 0; i < stringWithDoubleQuotes.length() - 3; i++) {
        String c = stringWithDoubleQuotes.substring(i, i + 2);
        if (c.matches(openingQuotePattern)) {
            doubleQuoteLevel++;
            firstPass += c;
        }
        else if (c.matches(closingQuotePattern)) {
            if (doubleQuoteLevel > 0) {
                doubleQuoteLevel--;
                firstPass += c;
            }
        }
        else {
            firstPass += c;
        }
    }

    String secondPass = "";
    doubleQuoteLevel = 0;
    for (int i = firstPass.length() - 1; i >= 0; i--) {
        String c = stringWithDoubleQuotes.substring(i, i + 2);
        if (c.matches(closingQuotePattern)) {
            doubleQuoteLevel++;
            secondPass = c + secondPass;
        }
        else if (c.matches(openingQuotePattern)) {
            if (doubleQuoteLevel > 0) {
                doubleQuoteLevel--;
                secondPass = c + secondPass;
            }
        }
        else {
            secondPass = c + secondPass;
        }
    }

    String result = secondPass;

    return result;
}

如果没有嵌套,它可能可以在单个正则表达式中完成。
有一个粗略定义的分隔符的概念,并且可以“偏差”
这些规则是为了获得更好的结果。
这完全取决于制定什么规则。这个正则表达式考虑到
按顺序排列三种可能的情况;

  1. 有效对
  2. 无效对(有偏差)
  3. 无效单

它也不会解析超出行尾的“”。但它确实有多种作用
行组合为单个字符串。要改变这一点,请删除\n你在哪里看到它。


全局上下文 - 原始查找正则表达式
缩短了

(?:("[a-zA-Z0-9\p{Punct}][^"\n]*(?<=[a-zA-Z0-9\p{Punct}])")|(?<![a-zA-Z0-9\p{Punct}])"([^"\n]*)"(?![a-zA-Z0-9\p{Punct}])|")

替换分组

$1$2 or \1\2

扩展的原始正则表达式:

(?:                            // Grouping
                                  // Try to line up a valid pair
   (                                 // Capt grp (1) start 
     "                               // "
      [a-zA-Z0-9\p{Punct}]              // 1 of [a-zA-Z0-9\p{Punct}]
      [^"\n]*                           // 0 or more non- [^"\n] characters
      (?<=[a-zA-Z0-9\p{Punct}])         // 1 of [a-zA-Z0-9\p{Punct}] behind us
     "                               // "
   )                                 // End capt grp (1)

  |                               // OR, try to line up an invalid pair
       (?<![a-zA-Z0-9\p{Punct}])     // Bias, not 1 of [a-zA-Z0-9\p{Punct}] behind us
     "                               // "
   (  [^"\n]*  )                        // Capt grp (2) - 0 or more non- [^"\n] characters
     "                               // "
       (?![a-zA-Z0-9\p{Punct}])      // Bias, not 1 of [a-zA-Z0-9\p{Punct}] ahead of us

  |                               // OR, this single " is considered invalid
     "                               // "
)                               // End Grouping

Perl 测试用例(没有 Java)

$str = '
string1=injunct! alter ego."
string2=successor "alter ego" single employer "a" free" proceeding "citation assets"
';

print "\n'$str'\n";

$str =~ s
/
  (?:
     (
       "[a-zA-Z0-9\p{Punct}]
        [^"\n]*
        (?<=[a-zA-Z0-9\p{Punct}])
       "
     )
   |
       (?<![a-zA-Z0-9\p{Punct}])
       " 
     (  [^"\n]*  )
       " (?![a-zA-Z0-9\p{Punct}])
   |
       "
  )
/$1$2/xg;

print "\n'$str'\n";

Output

'
string1=injunct! alter ego."
string2=successor "alter ego" single employer "a" free" proceeding "citation assets"
'

'
string1=injunct! alter ego.
string2=successor "alter ego" single employer "a" free proceeding "citation assets"
'
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何删除不平衡/不成对的双引号(在 Java 中) 的相关文章

随机推荐

  • 从同一页面上的 php 函数调用表单提交操作

    我正在开发一个简单的网络应用程序 为了减少文件数量 我想将表单提交功能的 php 代码放入与表单相同的页面中 像这样的东西
  • 该函数的运算符参数太多?

    制作了我自己的字符串类 显然是为了家庭作业 并且我的两个运算符出现了奇怪的语法错误 我的相等和添加运算符声称我有太多参数 即在我的 h 文件中 但随后又声称该方法甚至不属于我的 cpp 文件中的类 我什至将相等运算符设为朋友 但智能感知仍然
  • 在字符串中查找文本并添加到其他位置

    我正在尝试查找一些文本正则表达式 w http bit ly w ig它将找到这条绳子并将其拉出 将其移动到 span 标签 或在末尾 p tag p p class regex Text before http bit ly wtGAhs
  • Access ODBC 出现“未找到数据源名称且未指定默认驱动程序”

    我的软件 Python 3 4 64 位 PyODBC 64 位 已安装 MS Office 软件包 32 位 Problem 现在 我尝试使用 PYODBC 访问计算机中安装的 MS Access 2010 无论我尝试什么 它都不起作用
  • 文本文件中任意行的反转(rev 命令的实现)

    我尝试编写一段代码来旋转文本文件中的每一行 例如 给出下一行 a b c 输出将是 c b a 该脚本仅获取一个参数作为参数 文本文件的名称 另外 我想这样做 这样对额外的空间也很有意义 即 给出下一行 a b c 输出将是 c b a 注
  • C#、NUnit 在循环中断言

    我有一项学校作业 需要创建数据驱动风格的 NUnit 测试 使用下面的代码 我可以从数据库获取数据 但是每次 Assert 调用失败时 测试就会停止 有什么方法可以实际将循环结果显示为六个不同的测试 考虑到我的数据库中有六行 namespa
  • readelf -S 输出中的 ES、Lk、Inf 和 A​​l 列标题的含义是什么?

    在输出中readelf S 我想知道列标题是什么ES Lk Inf and Al mean 例如 Section Headers Nr Name Type Addr Off Size ES Flg Lk Inf Al 0 NULL 0000
  • 在 ASP .NET MVC 中编辑和更新实体框架实体

    我有一个名为 ABC 的实体框架实体 属性 ID 和标题 在更新记录视图中 我已将 ID 添加为隐藏字段 标题为文本框 控制器看起来像这样 public ActionResult UpdateAction ABC obj 我在 obj 中得
  • 如何将新列添加到 CSV 文件行的开头?

    我有一个 csv 文件 其中有 6 到 8 列 Ex ID Test Description file name module view path1 path2 我想添加新列 Node 到开头 Ex Node ID Test Descrip
  • 下面的 SQL HashBytes 函数需要 C# 等效项

    我在 sql 中使用以下函数创建了哈希值 SQL查询 Select hashbytes MD5 PNumber CONVERT VARCHAR 50 cast datestamp as binary 1 From dbo Events 现在
  • 如何更改jboss-7中的端口号

    我使用的是jboss 7 我想将端口号从8080更改为7001 我需要更改哪个文件 该文件是 JBOSS HOME standalone configuration standalone xml Find
  • 可以创建 Websphere 队列管理器但无法连接

    我需要编写一个连接到 WebSphere MQ 队列的 Net 连接器 因此我在 Windows 7 计算机上安装了 IBM WebSphere MQ 的试用版 我最初在 MQ Explorer 中设置了一些虚拟队列来进行设置过程 并且我能
  • 为什么每个应用程序有一个 JVM?

    我读到每个应用程序都在自己的 JVM 中运行 为什么会这样呢 他们为什么不让一个 JVM 运行 2 个或更多应用程序 我读了一篇 SO 帖子 但无法在那里得到答案 每个 Java 应用程序是否有一个 JVM https stackoverf
  • Apache poi 项目符号和编号

    我正在使用 apache POI 将 Word 文档转换为 pdf 我正在用动态数据填充表行 一切工作正常 但我想做一些增强 即我想在每行数据之前添加一个项目符号 这是我用来填充表中的行数据的 for 循环 for String strin
  • Ionic v3:按日期/天对列表进行分组

    在 Ionic 的旧版本 1 中 我能够构建一个按日期分组的事件列表 如下所示
  • 访问 Dockerfile 中的上下文外部

    在我的 Maven 项目中 我有以下结构 docker docker compose yml A Dockerfile B Dockerfile src target foo war 在 A 的 Dockerfile 中 我需要访问 war
  • 如何通过编程方式更改Toast的对齐方式? [复制]

    这个问题在这里已经有答案了 可能的重复 如何改变Android中Toast的位置 https stackoverflow com questions 2506876 how to change position of toast in an
  • Sass 中的多个二类选择器

    对于单个声明块有多个两类选择器 是否可以简化以下内容 即不必重复body tag body shop body contact body about body faq background color fff 尝试这个 body shop
  • Delphi 警告 - W1002 符号“FileSetDate”特定于平台

    当我在 Delphi 2006 下编译我的应用程序时 我收到以下警告 Pascal 警告 W1002 符号 FileSetDate 特定于平台 我必须做什么才能抑制这个警告 代码 MyLastError FileSetDate Files
  • 如何删除不平衡/不成对的双引号(在 Java 中)

    我想把这个相对聪明的问题分享给这里的大家 我正在尝试从字符串中删除不平衡 不配对的双引号 我的工作正在进行中 我可能即将找到解决方案 但是 我还没有找到可行的解决方案 我无法从字符串中删除未配对 未配对的双引号 输入示例 string1 i