如何用另一个字符串拆分字符串

时间:2017-06-27 19:40:08

标签: c# regex edi

我有这个字符串(来自EDI数据):

ISA*ESA?ISA*ESA?

*表示它可以是任何字符,可以是任意长度。

?表示任何单个字符。

只保证ISAESA不会改变。

我需要将这个分成两个字符串,如下所示:"ISA~this is date~ESA|"

"ISA~this is more data~ESA|"

我如何在c#中执行此操作?

我不能使用string.split,因为它没有真正的分隔符。

8 个答案:

答案 0 :(得分:1)

只需使用

即可
int x = whateverString.indexOf("?ISA"); // replace ? with the actual character here 

然后只使用从0到indexOf的子字符串,indexOf到length。

编辑: 如果?不知道, 我们可以只使用正则表达式模式和匹配器。

    Matcher matcher = Patter.compile("ISA.*ESA").match(whateverString);
    if(matcher.find()) { 
         matcher.find();
         int x = matcher.start();
    }

这里x将给出该匹配的起始索引。

编辑:我错误地认为它是java,对于C#

  string pattern = @"ISA.*ESA";
  Regex myRegex = new Regex(pattern, RegexOptions.IgnoreCase);

  Match m = myRegex.Match(whateverString);   // m is the first match
  while (m.Success)
  {
       Console.writeLine(m.value);
       m = m.NextMatch();              // more matches
  }

答案 1 :(得分:1)

RegEx可能是最好的。见this link

面具将是

ISA(?<data1>.*?)ESA.ISA(?<data2>.*?)ESA.

这将为您提供2组包含您需要的数据

Match match = Regex.Match(input, @"ISA(?<data1>.*?)ESA.ISA(?<data2>.*?)ESA.",RegexOptions.IgnoreCase);

if (match.Success)
{
    var data1 = match.Groups["data1"].Value;
    var data2 = match.Groups["data2"].Value;
}

使用Regex.Matches如果您需要找到多个匹配项,并根据需要指定不同的RegexOptions

答案 2 :(得分:1)

您可以使用Regex.Split来完成此操作

string splitStr = "|", inputStr = "ISA~this is date~ESA|ISA~this is more data~ESA|";

var regex = new Regex($@"(?<=ESA){Regex.Escape(splitStr)}(?=ISA)", RegexOptions.Compiled);
var items = regex.Split(inputStr);

foreach (var item in items) {
    Console.WriteLine(item);
}

输出:

ISA~this is date~ESA
ISA~this is more data~ESA|

请注意,如果ISAESA之间的字符串与我们正在寻找的模式相同,那么您必须找到一些聪明的方法。

稍微解释正则表达式:

(?<=ESA)   Look-behind assertion. This portion is not captured but still matched
(?=ISA)    Look-ahead assertion. This portion is not captured but still matched

使用这些环视断言,您可以找到正确的|字符进行拆分

答案 3 :(得分:0)

使用像ISA(。+?)ESA这样的Regex并选择第一组

string input = "ISA~mycontent+ESA";

Match match = Regex.Match(input, @"ISA(.+?)ESA",RegexOptions.IgnoreCase);

if (match.Success)
{
   string key = match.Groups[1].Value;              
}

答案 4 :(得分:0)

有点hacky但是你可以......

string x = "ISA*ESA?ISA*ESA?";

x = x.Replace("*","~"); // OR SOME OTHER DELIMITER

string[] y = x.Split('~');

在所有情况下都不完美,但它可以简单地解决您的问题。

答案 5 :(得分:0)

你可以通过&#34; ISA&#34;和&#34; ESA&#34;然后将这些部件放回原处。

  

字符串输入=&#34; ISA~这是日期~ESA | ISA~这是更多数据~ESA |&#34 ;;

= form_tag bob_scorecard_dashboard_index_path, :multipart => true do
                                             ↑
  

firstPart =&#34; ISA~这是日期~ESA |&#34;

     

secondPart =&#34; ISA~这是更多的数据~ESA |&#34 ;;

答案 6 :(得分:0)

我不是用字符串“拆分”,而是用字符串将你的问题描述为“分组”。这可以使用正则表达式轻松完成:

正则表达式:^(ISA.*?(?=ESA)ESA.)(ISA.*?(?=ESA)ESA.)$

说明:

  • ^ - 在字符串的开头断言位置
    • ( - 开始捕捉群组
    • ISA - 完全匹配字符串ISA
    • .*?(?=ESA) - 匹配任何字符0次或更多次,正面预测 字符串ESA(基本匹配任何字符,直到找到字符串ESA
    • ESA - 完全匹配字符串ESA
    • . - 匹配任何字符
    • ) - 结束捕获小组
    • 再重复一次......
  • $ - 在字符串
  • 的末尾断言位置

Try it on Regex101

示例:

string input = "ISA~this is date~ESA|ISA~this is more data~ESA|";
Regex regex = new Regex(@"^(ISA.*?(?=ESA)ESA.)(ISA.*?(?=ESA)ESA.)$",
    RegexOptions.Compiled);

Match match = regex.Match(input);
if (match.Success)
{
    string firstValue  = match.Groups[1].Value; // "ISA~this is date~ESA|"
    string secondValue = match.Groups[2].Value; // "ISA~this is more data~ESA|"
}

答案 7 :(得分:0)

“如何用另一个字符串拆分字符串”这个问题有两个答案。

var matches = input.Split(new [] { "ISA" }, StringSplitOptions.RemoveEmptyEntries);

var matches = Regex.Split(input, "ISA").ToList();

但是,第一个删除空条目,而第二个不删除。