Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/apache-flex/4.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
.net 在DotNet中使用RegExp提取嵌入式文本文件_.net_Regex - Fatal编程技术网

.net 在DotNet中使用RegExp提取嵌入式文本文件

.net 在DotNet中使用RegExp提取嵌入式文本文件,.net,regex,.net,Regex,我试图使用RegExp表达式提取存储在数据库中单个大字段中的文本文件。该字段被检索到字符串变量中,并由RegExp DotNet例程处理 这些文件被删除如下: %%%%% FILENAME1.TXT %%%%% (file content) %%%%% --END-- %%%%% %%%%% FILENAME2.TXT %%%%% (file content) %%%%% --END-- %%%%% %%%%% FILENAME2.TXT %%%%% (file content)

我试图使用RegExp表达式提取存储在数据库中单个大字段中的文本文件。该字段被检索到字符串变量中,并由RegExp DotNet例程处理

这些文件被删除如下:

%%%%% FILENAME1.TXT %%%%%

(file content)

%%%%% --END-- %%%%%

%%%%% FILENAME2.TXT %%%%%

(file content)

%%%%% --END-- %%%%%

%%%%% FILENAME2.TXT %%%%%

(file content)

%%%%% --END-- %%%%%

%%%%% FILENAME3.RESX %%%%%

(file content)

%%%%% --END-- %%%%%

etc. etc
RegExp如下所示:

RegExpMatchStr := "^%%%%*[\t ]*([A-Z,a-z,_,-,.,\\,:]*)[\t ]*%%%%*\r+(?s)(.*?)^%%%%*[\t ]*(--END--)[\t ]*%%%%*\r+\s*";
然而,当我在代码中测试这个字符串(以及在各种在线网站上测试DotNet中的regexp)时,我似乎只提取了每个文件的第一个

我错过了什么


编辑:我正在使用多行和IgnoreCase选项

regex_options := ('RegexOptions'.IgnoreCase as number) + ('RegexOptions'.Multiline as number);

regex_code := NEW NET_OBJECT 'Regex' with RegExpMatchStr as String, regex_options as 'RegexOptions';

single_match := CALL regex_code.Matches with rawcode_text_from_database;
我在在线Regex DotNet网站上尝试过该代码,它似乎只返回一个匹配集

编辑2:好的。。因此,上面的简化现在适用于上面建议的示例文本,但不适用于代码实际外观的更“真实”版本:

maintenance:
    title:  TEST2;;
    mlmname:  ZMLM_LIB_CSMLM_SAMPLE;;
    arden: version 2.5;;
    version:  0.00;;
    institution:  ;;
    author:  ;;
    specialist:  ;;
    date:  2015-04-10;;
    validation:  testing;;

library:
    purpose:  
    ;;
    explanation:  
    ;;
    keywords:
    ;;
    citations: 
    ;;
knowledge:
    type: data-driven;;
    data:

    standard_libs := MLM 'std_include_libs';
    include standard_libs;

    using "mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089";
    using "System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089";
    using "System.Configuration, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a";
    using "System.Configuration.Install, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a";
    using "System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089";
    using "System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089";

    using namespace "System";
    using namespace "System.IO";
    using namespace "System.Text";
    using namespace "System.Data";
    using namespace "System.Text.RegularExpressions";
    using namespace "System.Collections.Generic";

    source_code_MLM := "ZMLM_LIB_CSMLM_SAMPLE";

    (rawcode_text_from_database) := read first { "  SELECT [Logic] FROM [DEVPNL].[dbo].[CV3MLM] WHERE [Name] = " || SQL(source_code_MLM) };

    //RegExpMatchStr := "^%%%%*[\t ]*([A-Z,a-z,_,-,.]*)[\t ]*%%%%*$(?s)(.*?)^%%%%*[\t ]*(END)%%%%*$";
    //RegExpMatchStr := "^%%%%*[\t ]*([A-Z,a-z,_,-,.,\\,:]*)[\t ]*%%%%*\r+(?s)(.*?)^%%%%*[\t ]*(END)[\t ]*%%%%*\r+\s*";
    RexExpMatchStr := "^%%%%*[\t ]*([-A-Za-z_.\\:\d]*)[\t ]*%%%%*(\r?\n)+(?s)(.*?)^%%%%*[\t ]*(END)[\t ]*%%%%*(\r?\n)+\s*";

    regex_code := NEW NET_OBJECT 'Regex' with RegExpMatchStr as String, 'RegexOptions'.Multiline;
    single_match := CALL regex_code.Matches with rawcode_text_from_database;

break;

    //only getting on match

break;

        single_match := CALL single_match.NextMatch;

    endif;


        //code_lines_array := CALL 'Regex'.Split with code_lines_ONLY_from_database[0] as 'String', "\r\n" as 'String';
        //res_lines_array   := CALL 'Regex'.Split with res_lines_ONLY_from_database[0] as 'String', "\r\n" as 'String';


    ;;
    priority: 50
    ;;
    evoke:  
    ;;
    logic:
        conclude true;
    ;;
    action:
    ;;
Urgency: 50;;
end:

maintenance:
    title:  ;;
    mlmname:  ZMLM_LIB_CSMLM_SAMPLE;;
    arden: version 2.5;;
    version:  0.00;;
    institution:  ;;
    author:  ;;
    specialist:  ;;
    date:  2015-04-10;;
    validation:  testing;;

library:
    purpose:  
    ;;
    explanation:  
    ;;
    keywords:
    ;;
    citations: 
    ;;
knowledge:
    type: data-driven;;
    data:
    ;;
    priority: 50
    ;;
    evoke:  
    ;;
    logic:
        conclude true;
    ;;
    action:
    ;;
Urgency: 50;;
end:

%%%%% C:\TEST\SAMPLE.CS %%%%%

using System;

namespace First
{
    public class Program
    {
        public static void Main()
        {
        Console.WriteLine("Hello, world!");
        }
    }
}

%%%%% --END-- %%%%%




%%%%% C:\TEST\SAMPLE.RESX %%%%%

<?xml version="1.0" encoding="utf-8"?>
<root>
  <!-- 
    Microsoft ResX Schema 

    Version 2.0

    The primary goals of this format is to allow a simple XML format 
    that is mostly human readable. The generation and parsing of the 
    various data types are done through the TypeConverter classes 
    associated with the data types.

%%%%% --END-- %%%%%
维护:
标题:TEST2;;
mlmname:ZMLM_LIB_CSMLM_SAMPLE;;
雅顿:2.5版;;
版本:0.00 ;;;
机构:;;
作者:;;
专家:;;
日期:2015年4月10日;;
验证:测试;;
图书馆:
目的:
;;
说明:
;;
关键词:
;;
引文:
;;
知识:
类型:数据驱动;;
数据:
标准库存量:=传销“标准库存量包括库存量”;
包括标准库;
使用“mscorlib,Version=4.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089”;
使用“系统,版本=4.0.0.0,区域性=中性,PublicKeyToken=b77a5c561934e089”;
使用“System.Configuration,Version=4.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a”;
使用“System.Configuration.Install,Version=4.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a”;
使用“System.Core,Version=4.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089”;
使用“System.Data,Version=4.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089”;
使用名称空间“系统”;
使用名称空间“System.IO”;
使用名称空间“System.Text”;
使用名称空间“System.Data”;
使用名称空间“System.Text.RegularExpressions”;
使用名称空间“System.Collections.Generic”;
source_code_MLM:=“ZMLM_LIB_CSMLM_SAMPLE”;
(rawcode_text_from_database):=首先读取{“从[DEVPNL].[dbo].[CV3MLM]中选择[Logic],其中[Name]=”| | SQL(源代码_MLM)};
//RegExpMatchStr:=“^%%%%*[\t]*([A-Z,A-Z,,-,.]*)[\t]*%%*$(?s)(*?)^%%%*[\t]*(END)%%%*$”;
//RegExpMatchStr:=“^%%%%*[\t]*([A-Z,A-Z,,,,\,:]*)[\t]*%%%*\r+(?s)(?)(*?)^%%%*[\t]*(END)[\t]*%%%%*\r+\s*”;
RexExpMatchStr:=“^%%%%*[\t]*([-A-Za-z\\:\d]*)[\t]*%%*(\r?\n)+(?s)(.*)^%%%*[\t]*(END)[\t]*%%*(\r?\n)+\s*”;
regex_代码:=新的净对象“regex”,RegExpMatchStr为字符串“RegexOptions”。多行;
single_match:=调用正则表达式_code.Matches与_数据库中的rawcode_text_匹配;
打破
//只是在比赛中
打破
single_match:=调用single_match.NextMatch;
endif;
//代码行数组:=调用'Regex'。将数据库[0]中的代码行拆分为'String',“\r\n”拆分为'String';
//res_lines_array:=调用'Regex'。仅使用_数据库[0]中的res_lines_作为'String'拆分,“\r\n”作为'String';
;;
优先权:50
;;
唤起:
;;
逻辑:
得出正确的结论;
;;
行动:
;;
紧急程度:50;;
完:
维护:
标题:;;
mlmname:ZMLM_LIB_CSMLM_SAMPLE;;
雅顿:2.5版;;
版本:0.00 ;;;
机构:;;
作者:;;
专家:;;
日期:2015年4月10日;;
验证:测试;;
图书馆:
目的:
;;
说明:
;;
关键词:
;;
引文:
;;
知识:
类型:数据驱动;;
数据:
;;
优先权:50
;;
唤起:
;;
逻辑:
得出正确的结论;
;;
行动:
;;
紧急程度:50;;
完:
%%%%%C:\TEST\SAMPLE.CS%%
使用制度;
名称空间优先
{
公共课程
{
公共静态void Main()
{
控制台.WriteLine(“你好,世界!”);
}
}
}
%%%%%--结束--%%%
%%%%%C:\TEST\SAMPLE.RESX%%

您必须指定
RegexOptions.Multiline
选项以匹配行首的
^

string input = 
@"%%%%% FILENAME1.TXT %%%%%

(file content)

%%%%% --END-- %%%%%

%%%%% FILENAME2.TXT %%%%%

(file content)

%%%%% --END-- %%%%%

%%%%% FILENAME2.TXT %%%%%

(file content)

%%%%% --END-- %%%%%

%%%%% FILENAME3.RESX %%%%%

(file content)

%%%%% --END-- %%%%%";
string pattern = @"^%%%%*[\t ]*([-A-Za-z_.\\:\d]*)[\t ]*%%%%*(\r?\n)+(?s)(.*?)^%%%%*[\t ]*(--END--)[\t ]*%%%%*(\r?\n)+\s*";
string[] output = Regex.Matches(input, pattern, RegexOptions.Multiline)
                       .OfType<Match>()
                       .Select(m => m.Value)
                       .ToArray();
字符串输入=
@“%%%FILENAME1.TXT%%”
(文件内容)
%%%%%--结束--%%%
%%%%%FILENAME2.TXT%%
(文件内容)
%%%%%--结束--%%%
%%%%%FILENAME2.TXT%%
(文件内容)
%%%%%--结束--%%%
%%%%%FILENAME3.RESX%%
(文件内容)
%%%%%--结束--%;
字符串模式=@“^%%%%*[\t]*([-A-Za-z\\:\d]*)[\t]*%%*(\r?\n)+(s)(.*)^%%%*[\t]*(-END--)[\t]*%%*(\r?\n)+\s*”;
string[]output=Regex.Matches(输入、模式、RegexOptions.Multiline)
第()类
.选择(m=>m.Value)
.ToArray();

我正在使用正则表达式配置中的多行和IgnoreCase选项。将添加到上述描述中。我无法显示实际的代码,因为它使用的是非标准的DotNet语言(但调用DotNet对象)。如前所述-我已经尝试了DotNet Regex的在线测试程序,同样的情况也发生了。@dmc2005您会尝试什么样的在线测试程序?以下为我提供了4个匹配项:。另外,请验证是否在代码中调用了
匹配
方法(而不是
匹配
)。另外,请注意,我在文件名regex中添加了
\d
。实际上,我首先在regex101上开发了上述内容,但DotNet实现不同。然后我试了一下,没问题。。因此,我的简化似乎适用于您的代码:)我根据原始问题将其标记为正确,因为它实际上根据简化代码工作。如果你能弄明白为什么更精确的Regexp'ed文件不起作用,我将永远感激你!