Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用正则表达式从文本文件中剥离数据_Java_Regex_Text_Fileinputstream_Datainputstream - Fatal编程技术网

Java 使用正则表达式从文本文件中剥离数据

Java 使用正则表达式从文本文件中剥离数据,java,regex,text,fileinputstream,datainputstream,Java,Regex,Text,Fileinputstream,Datainputstream,我将从发布文本文件中的数据开始,这只是其中的4行,实际上文件有几百行长 Friday, September 9 2011 5:00AM - 11:59PM STH 1102 HOLD DO NOT BOOK Report Printed on 9/08/2011 at 2:37 PM Page 1 of 1 Friday, Sept

我将从发布文本文件中的数据开始,这只是其中的4行,实际上文件有几百行长

Friday, September  9 2011        5:00AM - 11:59PM       STH 1102                HOLD DO NOT BOOK                                                 
Report Printed on 9/08/2011 at  2:37 PM   Page 1 of 1 

Friday, September  9 2011        5:00AM - 11:00PM       STH 4155 (BOARDROOM)    HOLD - DO NOT BOOK                     
Hold - Do Not Book        Report Printed on 9/08/2011 at  2:37 PM   Page 1 of 1 

Friday, September  9 2011        5:00AM - 11:59PM       UC 2 (COMPUTER LAB)     HOLD DO NOT BOOK                       
do not book               Report Printed on 9/08/2011 at  2:37 PM   Page 1 of 1 

Friday, September  9 2011        5:00PM - 11:00PM       AH GYM                  USC ORIENTATION 2011 - REVISED         
USC Orientation 2011      Report Printed on 9/08/2011 at  2:37 PM   Page 1 of 1
文本的每一小段都在文本文件中的一行上,由许多空格分隔,由于某些原因,这些空格不会出现在问题格式中。我将使用文本的第一段作为示例,说明我试图获取的数据

这是我想从文件
Friday
5:00
11:59
STH 1102
中获取的数据,然后忽略该行的读取,文本部分第二行的所有信息都可以忽略,但在文本文件本身中,所有信息都在一行上。然后有了这些数据,我想把每一部分都保存到一个变量中。或者,表示
HOLD don BOOK
的数据部分有时格式如下:
don BOOK
HOLD-don BOOK
,如果正则表达式发现其中任何一个,它可以忽略该行前后的所有数据

此外,如果你我可以,我想采取的时间,有下午在他们和增加12到他们,使他们在24小时的格式

以下是我目前阅读全文的方式。然后,一旦用户将路径放入scheduleTxt JTextfield,我就调用这个函数。它可以很好地读取和打印每一行

public void readFile () throws IOException
    {
        try
        {
            FileInputStream fstream = new FileInputStream(scheduleTxt.getText());
            DataInputStream in = new DataInputStream(fstream);
            BufferedReader br = new BufferedReader(new InputStreamReader(in));
            String strLine;
            while ((strLine = br.readLine()) != null)   
            {
                        System.out.println (str1);      
            }
            in.close();
        }
        catch (Exception e){
            System.err.println("Error: " + e.getMessage());
        }
    }
我知道这个问题有很多,希望你能理解我的问题,如果有什么不清楚的地方,就直接问吧,谢谢!牛肉


更新:我只是想也许这会有助于解释我对这些数据的意图,首先我会将任何下午时间转换为24小时格式,然后根据第四条数据(
STH 1102
)我调用一个insert函数,该函数将使用ODBC驱动程序将行中的其他数据插入数据库,这些数据看起来像字段之间的选项卡。如果我是你,我会使用非正则表达式文本操作来分割
\t
字符上每三行的第一行。这应该会给你
STH 1102
HOLD don't BOOK
,没有任何进一步的处理

剩下的是星期五、
5:00和11:59。您仍然可以通过文本操作获得这些片段:在逗号上拆分
9月5日星期五
,然后在字符串上拆分
5:00AM-11:59PM
(一个连字符,周围有空格)

如果仍然需要这些正则表达式,可以分别使用
“[A-Za-z]+(?=,)”
”(\\d{1,2}:\\d{2}[PA]M)-(\\d{1,2}:\\d{2}[PA]M)
。第二个模式将返回捕获组1和2中所需的时间

对于整个事情来说,Regex可能不是最好的方法,但这可能会起作用:

"^([^,]+),.*\\t(\\d{1,2}:\\d{2}[PA]M) - (\\d{1,2}:\\d{2}[PA]M)\\t([^\\t]+)\\t([^\\t]+)$"
您需要的值将位于捕获组1-5中

编辑: 因为您已经指出这些不是组之间的选项卡,所以上面的正则表达式将无法正常工作。但是,这可能意味着字段位于固定位置。找出每个组从哪个索引开始,然后使用
String.substring
选择从那里到下一个组的所有内容,并
String.trim
结果。然后,您可以像我上面描述的那样处理星期几和时间部分:
“[A-Za-z]+(?=,)”
“(\\d{1,2}:\\d{2}[PA]M)-(\\d{1,2}:\\d{2}[PA]M)”
,或非正则字符串操作


此外,如果在第一个“时间”值之前实际上有一个选项卡,则可能会扰乱定位。拆分该选项卡上的字符串,并使用我在右侧部分描述的
子字符串
方法。左侧部分可以在
上拆分以查找一周中的哪一天。

我认为使用
StringTokenizer
String.split()
拆分文本并按其在字符串中的位置访问每个部分是值得的。正则表达式同样脆弱,编写起来也要复杂得多。

行中的“字段”位于固定位置?看起来第一个字段(您想要的)位于固定位置,因此不需要正则表达式,只需在该位置使用子字符串。是的,我猜它们都位于固定位置,但文本文件每天都在更改,因此我想我宁愿在固定位置更改时进行正则表达式搜索,如果第一个时间字段为10,11,或者12它的位置将比1-9早1个位置我刚刚检查了它们是否是选项卡,但它们不是选项卡,选项卡上唯一的数据是第一次数据,我希望我可以显示实际的文本文件,但每一行都太长,无法放入单个屏幕快照,并且正则表达式行不起作用,我不知道这是否是因为我没有提到周五之前也有大量的空白,所以当你说每组从哪个索引开始时,你的意思是像周五开始30个空格,然后5:00开始86个空格?诸如此类on@Beef-星期五<代码>不是从位置0开始吗?您可能希望分别分析每一行。我所说的索引是字符串中某个特定值开始的位置,因此它是您将馈送到
string.substring
的数字。这有意义吗?不,在实际的文本文件中,它不是从0开始的,我必须大大减少所有数据之间的空格量,以减少问题中的混乱程度,我不确定我是否完全理解,我很确定我了解
子字符串
修剪
的用法,只是不知道在这种情况下如何使用
子字符串
,据我所知,它用于生成一个大字符串,并在某些字符上对其进行分解,类似于php中的explode函数,但是没有ITE的数组部分例如:如果
STH 1102
部分总是从行中的80位开始,而
HOLD DO NOT BOOK
从100位开始,您可以执行类似于
stringroomnumber=line.substring(80,99).trim()的操作;字符串cl