【问题标题】:How to prevent CR/LF?如何预防CR/LF?
【发布时间】:2016-03-31 15:31:25
【问题描述】:

我正在阅读使用pdfbox 的pdf 文件,显然,至少在基于Windows 的框架上,对于换行符,它使用
&#10 这样的unicode。

我的问题是如何防止这个换行符连接到下面代码中的字符串?

tokenizer =new StringTokenizer(Text,"\\.");
while(tokenizer.hasMoreTokens())
{
    String x= tokenizer.nextToken();
    flag=0;
    for(final String s :x.split(" ")) {
       if(flag==1)
          break;
       if(Keyword.toLowerCase().equals(s.toLowerCase()) && !"".equals(s)) {
          sum+=x+"."; //here need first to check for "
&#10"
                      // before concatenating the String "x" to String "sum"
          flag=1;
       }
   }
}

【问题讨论】:

  • !"".equals(s) -> s.isEmpty() ?!使用 StringBuilder 代替 sum+=x+".";
  • 尝试x.trim()删除开头和结尾的空格,然后检查x.isEmpty()
  • @fafl 对 .trim() 没有用处。
  • @Tokazio 我应该如何使用它?你能举个简短的例子吗?
  • 可能是一个简单的替换("\r\n",""); ?

标签: java html string line-breaks pdfbox


【解决方案1】:

拆分时应丢弃行分隔符;例如

for (final String s : x.split("\\s+")) {

这使单词分隔符成为一个或多个空白字符。

(使用trim() 并非在所有情况下都有效。假设x 包含"word\r\nword"。您不会在这两个词之间进行拆分,而s 在某些时候将是"word\r\nword"。然后s.trim() 不会删除换行符,因为它们不在字符串的末尾。)


更新

我刚刚发现您实际上是在附加 x 而不是 s。所以你还需要做这样的事情:

sum += x.replaceAll("\\s+", " ") + "."

这比你要求的要多一点。它用一个空格替换每个空格序列。


顺便说一句,如果您使用break 来跳出循环而不是乱用标志,您的代码会更简单、更高效。 (而且 Java 有一个 boolean 类型......看在上帝的份上!)

   if (Keyword.toLowerCase().equals(s.toLowerCase()) && !"".equals(s)) {
       sum += ....
       break;
   }

【讨论】:

  • 很遗憾,它仍然包含换行提要。
  • @AJNeufeld - 这无济于事。 \r\n\s 字符类的成员。
  • 我没有休息一下吗?我知道 Java 有一个布尔类型,所以我认为 value1 的整数为真,0 为假。那是错的吗?我的意思是,我使用整数作为布尔值,1 为真,0 为假,就像布尔剂量一样。我知道int 浪费了很多内存空间,但这不是商业产品,所以我想这不会有害吗?如果这是一个严重的错误,你现在可以向我指出。
  • 回复break:是的,你做到了......但不是在正确的地方。回复:使用boolean 而不是int:使用它是为了清晰,而不是效率。它不是商业的事实是无关紧要的。关键是其他人(比如我们)需要阅读你的代码。
  • 好的。但是你能告诉我使用 break 的正确方法在哪里吗?我的意思是在我的代码上下文中。
【解决方案2】:

您确定要在此处添加x 吗?

if(Keyword.toLowerCase().equals(s.toLowerCase()) && !"".equals(s)) {
    sum+=x+"."; //here need first to check for "
&#10"
                // before concatenating the String "x" to String "sum"
    flag=1;
}

你不想s吗?

    sum += s + ".";

更新

哦,我明白了。所以你真正想要的更像是:

tokenizer = new StringTokenizer(Text,"\\.");
Pattern KEYWORD = Pattern.compile("\\b"+Keyword+"\\b", Pattern.CASE_INSENSITIVE);
StringBuilder sb = new StringBuilder(sum);
while(tokenizer.hasMoreTokens())
{
    String x = tokenizer.nextToken();
    if (KEYWORD.matcher(x).find()) {
        sb.append(x.replaceAll("\\s+", " ")).append('.');
    }
}
sum = sb.toString();

(假设关键字以字母开头和结尾,并且本身不包含任何正则表达式代码)

【讨论】:

  • 不,我确定我想要x,因为s 是它的一个标记,当s 等于一个关键字时,我想保存整个x 而不是s 的原因是没用的。
  • 好吧,x.split(...) 不会修改x,所以x 中的任何换行符仍会在其中。您需要使用@Stephen 已经发布的解决方案。
猜你喜欢
  • 2011-03-07
  • 1970-01-01
  • 2019-03-14
  • 2012-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多