【问题标题】:How to remove the text within the specified starting and ending lines in java如何在java中删除指定的开始行和结束行内的文本
【发布时间】:2012-12-16 20:57:07
【问题描述】:

我正在使用 java 将脚本写入带有 cmets 的文本文件。评论里面,写了我的sql脚本。我正在评论 actions startsactions ends 中编写我的脚本,并且我希望稍后将此评论中的脚本替换为其他一些脚本。 如何删除指定评论中可用的脚本添加新脚本

--
-- `actions` starts
--
CREATE TABLE IF NOT EXISTS `actions` (
  `aid` varchar(255) NOT NULL DEFAULT '0' COMMENT 'Primary Key: Unique actions ID.',
  `type` varchar(32) NOT NULL DEFAULT '' COMMENT 'The object  acts on ',
  PRIMARY KEY (`aid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='Stores action.';
--
-- `actions` ends
--

--
-- `operations` starts
--
CREATE TABLE IF NOT EXISTS `operations` (
  `type` varchar(32) NOT NULL DEFAULT '' COMMENT 'The object that that action acts on ',
  `callback` varchar(255) NOT NULL DEFAULT '' COMMENT 'The callback ',
  `parameters` longblob NOT NULL COMMENT 'Parameters to be passed to .',
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='Stores operations.';
--
-- `operations` ends
--

【问题讨论】:

  • 您在String 或文件中有完整的脚本?
  • 目的是什么?如果您仅详细描述您要实现的目标,也许有人可以帮助您找到捷径。
  • 我正在将所有这些脚本写在一个文件中。
  • 您想在生成文件时(使用 Java、从另一个文件或从其他来源)还是在运行它时(在 MySQL 中)进行此替换?由于这被标记为java,我假设它是前者是否正确? (下一个问题是 - 你是如何生成它的,最好包含一些代码) 旁注 - 根据我的理解,术语是脚本是一堆 SQL 语句(或代码)(如文件中的 SQL script) 并且您想用其他一些语句替换两个 cmets 之间的一些语句。到处使用script 非常令人困惑。

标签: java string text replace


【解决方案1】:

我找到了解决方案。解决方案是使用 indexOf 方法来识别起始块和结束块。我使用的代码是,

private static final String VARIABLE_FIELD = "variable";
private static final String END_MODULE_END_TAG = "' ends";
private static final String START_MODULE_END_TAG = "' starts";
private static final String MODULE_START_TAG = "-- '";
private static final String DOUBLE_HYPHEN = "--";
private static final String VALUE_FIELD = "value";
private static final String NAME_FIELD = "name";
private static final String SQL_VARIABLE_SEP = "`,`";
private static final String SQL_VALUE_SEP = "','";
private static final String SINGLE_QUOTE = "'";
private static final String LINE_BREAK = "\n";
private static final String EQUAL = "=";

File scriptFile = new File(versionFile + File.separator + fileName);
StringBuffer sb = new StringBuffer();
if (scriptFile.isFile()) {
    // if script file is available need to replace the content
    buff = new BufferedReader(new FileReader(scriptFile));
    String readBuff = buff.readLine();
    String sectionStarts = MODULE_START_TAG + moduleName + START_MODULE_END_TAG;
    String sectionEnds = MODULE_START_TAG + moduleName + END_MODULE_END_TAG;

    while (readBuff != null) {
        sb.append(readBuff);
        sb.append(LINE_BREAK);
        readBuff = buff.readLine();
    }

    int cnt1 = sb.indexOf(sectionStarts);
    int cnt2 = sb.indexOf(sectionEnds);
    if (cnt1 != -1 || cnt2 != -1) {
        sb.replace(cnt1 + sectionStarts.length(), cnt2, LINE_BREAK + queryString + LINE_BREAK);
    } else {
        // if this module is not added already in the file and need to add this config alone
        sb.append(LINE_BREAK + DOUBLE_HYPHEN + LINE_BREAK);
        sb.append(MODULE_START_TAG + moduleName + START_MODULE_END_TAG + LINE_BREAK);
        sb.append(queryString);
        sb.append(LINE_BREAK);
        sb.append(MODULE_START_TAG + moduleName + END_MODULE_END_TAG + LINE_BREAK);
        sb.append(DOUBLE_HYPHEN + LINE_BREAK);
    }
}

关键代码是

int cnt1 = sb.indexOf(sectionStarts); int cnt2 = sb.indexOf(sectionEnds); 如果 (cnt1 != -1 || cnt2 != -1) { sb.replace(cnt1 + sectionStarts.length(), cnt2, LINE_BREAK + queryString + LINE_BREAK); }

int cnt1 = sb.indexOf(sectionStarts); 标识开始标签,int cnt2 = sb.indexOf(sectionEnds); 标识结束标签。 p>

它会找到块并用新的内容替换内容。

【讨论】:

  • 我认为您可以将文件加载到 String obj 中(如果文件不大),并使用正则表达式进行处理。您可能需要多线模式。我想这种方式会更容易处理。
猜你喜欢
  • 2022-01-09
  • 1970-01-01
  • 1970-01-01
  • 2019-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多