用java中的空格替换回车符

时间:2015-04-24 07:28:19

标签: java regex drools

我在java中的字符串变量中有以下字符串。

rule "6"
no-loop true
    when
    then
    String prefix = null;
    prefix = "900";
    String style = null;
    style = "490";
    String  grade = null;
    grade = "GL";
    double basePrice = 0.0;
    basePrice = 837.00;
    String ruleName = null;
    ruleName = "SIVM_BASE_PRICE_006
Rahul Kumar Singh";
    ProductConfigurationCreator.createFact(drools, prefix, style,grade,baseprice,rulename);
end
rule "5"
no-loop true
    when
    then
    String prefix = null;
    prefix = "800";
    String style = null;
    style = "481";
    String  grade = null;
    grade = "FL";
    double basePrice = 0.0;
    basePrice = 882.00;
    String ruleName = null;
    ruleName = "SIVM_BASE_PRICE_005";
    ProductConfigurationCreator.createFact(drools, prefix, style,grade,baseprice,rulename);
end

我需要将这个回车换成"那么"和"结束"带有空格的关键字,使其变得像下面的代码:

rule "6"
no-loop true
    when
    then
    String prefix = null;
    prefix = "900";
    String style = null;
    style = "490";
    String  grade = null;
    grade = "GL";
    double basePrice = 0.0;
    basePrice = 837.00;
    String ruleName = null;
    ruleName = "SIVM_BASE_PRICE_006 Rahul Kumar Singh";
    ProductConfigurationCreator.createFact(drools, prefix, style,grade,baseprice,rulename);
end

rule "5"
no-loop true
    when
    then
    String prefix = null;
    prefix = "800";
    String style = null;
    style = "481";
    String  grade = null;
    grade = "FL";
    double basePrice = 0.0;
    basePrice = 882.00;
    String ruleName = null;
    ruleName = "SIVM_BASE_PRICE_005";
    ProductConfigurationCreator.createFact(drools, prefix, style,grade,baseprice,rulename);
end

在上面两个字符串集的例子中,第二个是我需要的正确格式。但是,在第一组中,我得到了这个:

ruleName = "SIVM_BASE_PRICE_006
Rahul Kumar Singh";

这个必须要像这样:

ruleName = "SIVM_BASE_PRICE_006 Rahul Kumar Singh";

我还需要确保这不会影响字符串中的任何其他内容。 因此,我需要更换这个"回车"有一个白色的空间,并在一条线。这是我的要求。我尝试使用replace和replaceAll方法的字符串但不能正常工作。

问题:

  

我需要查看字符串"然后"和"结束"而且每当   在两个双重标语之间有任何回车"" "&#34 ;;一世   需要用白色空间替换这个回车并将其放入   一行。

由于

编辑:

DRT:

template header
Prefix
Style
Product

package com.xx
import com.xx.drools.ProductConfigurationCreator;

template "ProductSetUp"
rule "Product_@{row.rowNumber}"
no-loop true
    when
    then
      String prefix = null;
      prefix = "@{Prefix}";
      String style = null;
      prefix = "@{Style}";
      String product = null;
      product = "@{Product}";
      ProductConfigurationCreator.createProductFact(drools,prefix,style,product);
end
end template

excel和drt仅用于演示目的。 在图像的“产品”列中,有“#SOFAS \ rkumar shorav"”。实际上这是在制造问题。这将产生如下:

product = "SOFAS
kumar shorav";

我需要如下所示:

product = "SOFAS kumar shorav";

然后Excel数据:

附加图片。enter image description here

4 个答案:

答案 0 :(得分:2)

而不是正则表达式我可能会编写自己的格式化程序

  • 检查光标是否在引号内
  • 将每个\r替换为空格
  • 将每个\n替换为空格,除非它位于\r之后,这意味着已经为\r
  • 放置了空格
  • 不加改动地写下其余的字符。

唯一可能的问题是这个格式化程序不关心字符串的放置位置,因此如果要格式化字符串的某些特定部分,则只需要提供该部分。

实现此格式化程序的代码可能如下所示:

public static String format(String text){

    StringBuilder sb = new StringBuilder();
    boolean insideQuote = false;
    char previous = '\0';//to track `\r\n`

    for (char ch : text.toCharArray()) {

        if (insideQuote && 
                 (ch == '\r' || 
                  ch == '\n' && previous != '\r') ) {
            sb.append(" ");//replace `\r` or `\n` with space
        }else {
            if (ch == '"') {
                insideQuote = !insideQuote;
            }
            sb.append(ch); //write other characters without change
        }
        previous = ch;
    }

    return sb.toString();

}

辅助工具方法

public static String format(File file, String encoding) throws IOException {
    String text = new String(Files.readAllBytes(file.toPath()), encoding);
    return format(text);
}

用法:

String formatted = format(new File("input.txt"), "utf-8");
System.out.println(formatted);

答案 1 :(得分:1)

你可能会说org.drools.template.parser.StringCell中存在一个错误,方法

public void addValue(Map<String, Object> vars) {
    vars.put(column.getName(), value);
}

这里,该值作为String添加到Map中,但这并未考虑字符串值通常扩展为字符串文字。因此,嵌入的换行符应转换为转义序列\n。您可以尝试这个补丁:

public void addValue(Map<String, Object> vars) {
    String h = value.replaceAll( "\n", "\\\\n" );
    vars.put(column.getName(), h);
}

获取源文件,将其放入合适的子目录,将其编译为类文件,并确保根目录在类路径中位于drools-templates-6.2.0.Final-sources.jar之前。然后你应该看到

ruleName = "SIVM_BASE_PRICE_006\nRahul Kumar Singh";
生成的DRL文件中的

。显然,这不是一个空格,但它是在电子表格单元格中写的!

我建议(紧急)你遵循这种方法。原因很简单,字符串并不总是在引号之间展开,然后替换几乎肯定会导致无效代码。根本没有补救措施,因为模板编译器是&#34; dumb&#34;并没有真正&#34;知道&#34;它正在扩展。

如果电子表格中的字符串包含换行符,则模板扩展必须忠实地呈现此行,并在那里打破该行。如果这产生无效(Java)代码:为什么首先输入换行符? 绝对没有理由在那个单元格中有空格,如果这就是你想要的。

答案 2 :(得分:0)

s = s.replaceAll("(?m)^([^\"]*(\"[^\"]*\")*[^\"]*\"[^\"]*)\r?\n\\s*", "$1 ");

这会将带有不成对引号的行替换为替换为行结尾的行。

^.... means starting at the line begin
[^\"] means not quote
\r?\n catches both CR+LF (Windows) as LF (Rest) line endings

not-quotes,
    repetition of " not-quotes ",
    not quotes, quote, not-quotes, newline

介意这不包括反斜杠+引用,逃避它们自我。

答案 3 :(得分:-1)

使用&#34;多线&#34;标志:

str = str.replaceAll("(?m)^\\s+", "");

多行标记(?m)使^$匹配每行的开头/结尾(而不是输入的开头/结尾)。 \s+表示&#34;一个或多个空白字符&#34;。