首页 > 解决方案 > 从文件中读取的 java 代码应该读取完整的文件,但不会

问题描述

Java 代码从文件中读取带大括号的单词,然后写入不带大括号的单词

代码工作正常,因为它读取文件并显示不带括号的单词,但它是一个有四百行的巨大文件,但结果仅显示几行,这意味着代码读取文件并写入不带大括号的单词但不迭代通过完整的文件

更改了常规的 espression 但这很好,因为它可以读取带有大括号的任何单词并写入不带大括号的单词

起作用的代码

import java.io.File;
import java.io.IOException;
import org.apache.commons.io.FileUtils;

public class StringUtilitiesFromFile  {
public static void main(String[] args) throws IOException 
        {
                String Android = "Android is CS and (OS)";
                String OS = Android.replaceAll("\\(.*\\)", "");  
                System.out.println("Android " + OS);
       }

}

结果是 Android Android 是 CS 并且不打印带括号的 (OS)

import java.io.File;
import java.io.IOException;
import org.apache.commons.io.FileUtils;

public class StringUtilitiesFromFile  {
    public static void main(String[] args) throws IOException 
        {
              File file = new File("Auth.html");
        String string = FileUtils.readFileToString(file);  
                String And = string.replaceAll("\\(.*\\)", "");  
        System.out.println(And);    
                System.out.println("");           
       }
}

结果是: 船下的大道 胡子 绑定 光明 预算 建造者 隔板 商人 商人 女商人 屠夫 笼 碳 碳 致癌物 卡 警告 谨慎 洞穴 特征 首席 粘土 清洁 教练 煤炭 舒适 消费品 消费品 联系 酷 勇气 勇气 勇敢 课程 法庭 表弟 掩护 残酷 辩论 辩护 被告 辩护国防蔑视赤字定义

大约有 24 行,但实际文件包含大约 400 行

该文件有单词能力(名词)能够(形容词)约(介词)约(副词)上面(副词)上面(介词)国外(副词)缺席(名词)缺席(形容词)绝对(形容词)抽象摘要(形容词) abuse (形容词)a(不定冠词)放弃(动词)能力(名词)能(形容词)约(介词)约(副词)以上(副词)以上(介词)国外(副词)缺席(名词)缺席(形容词)绝对(形容词)摘要摘要(形容词)滥用(动词)滥用(名词)滥用学术(形容词)接受(动词)可接受(形容词)接受访问(动词)访问(名词)陪伴(动词)根据+to (介词) account (动词) account (名词) accountant accuracy (形容词)accuse ache (名词) ache达到 (动词) acquire (动词) acquit across (副词) through (介词) act (动词) act (名词) action (名词) active activity (名词) actor actoractual (形容词) 实际上 (副词) adapt (动词) add (动词) add (名词) Additional (形容词) address (名词) address (动词) 适当的 (形容词) adjourn adjust (动词) 行政 (名词) 钦佩 (动词) 接纳 (名词) 承认 (动词) 采用 (动词) 收养成人 (名词) 成人 (形容词) 推进 (名词) 推进 (动词) 优势 (名词) 冒险 (名词) 冒险的广告(动词) 广告 (名词) 忠告 (动词) 事件 (名词) 影响 (动词) 深情 (动词) 害怕 (形容词) 之后 (副词) 之后 (连词) 之后 (介词) 下午 (副词)反对(介词)年龄(名词)年龄(动词)代理(名词)代理(名词)恶化积极前同意(动词)协议(名词)农业前进(副词)援助(动词)援助(名词)目标(名词)目标(动词) 空中交通管制员飞机 (名词) 机场 (名词) 过道警报 (动词) 警报 (名词) 警报 (名词) 警报 (形容词) 警报 (动词) alibi alimony alive (形容词) 全部 (副词) 全部 (代词) 全部(形容词) 好 (副词) 好 (形容词)好的(副词) 好的(形容词)好的(副词) 好的(形容词)

有更多行;代码应该只读取没有大括号的单词并写入

标签: java

解决方案


我认为您的正则表达式可能会遇到问题。

您正在尝试剔除与此匹配的所有字符:\(.*\). 问题是字符 "(" 和 ")" 也 match .*,所以你的表达式匹配(+任何东西,包括括号+ ),这可能会删除你不打算删除的整个单词。

一种解决方案是使用不情愿的量词而不是贪婪的量词。使用*?代替*来实现这一点。它将匹配满足您的正则表达式的最少字符数。另一种选择是明确排除正则表达式中的括号,如\([^()]*\).

尝试这个:

import java.io.File;
import java.io.IOException;
import org.apache.commons.io.FileUtils;

public class StringUtilitiesFromFile  {
    public static void main(String[] args) throws IOException 
        {
              File file = new File("Auth.html");
        String string = FileUtils.readFileToString(file);  
                String And = string.replaceAll("\\(.*?\\)", "");  
        System.out.println(And);    
                System.out.println("");           
       }
}

去像RegexPlanet这样的正则表达式测试器来解决问题。

请参阅Greedy vs. Reluctant Quantifiers的文档


推荐阅读