我在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数据:
附加图片。
答案 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;。