我有这个字符串(来自EDI数据):
ISA*ESA?ISA*ESA?
*
表示它可以是任何字符,可以是任意长度。
?
表示任何单个字符。
只保证ISA
和ESA
不会改变。
我需要将这个分成两个字符串,如下所示:"ISA~this is date~ESA|"
和
"ISA~this is more data~ESA|"
我如何在c#中执行此操作?
我不能使用string.split,因为它没有真正的分隔符。
答案 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|
请注意,如果ISA
和ESA
之间的字符串与我们正在寻找的模式相同,那么您必须找到一些聪明的方法。
稍微解释正则表达式:
(?<=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
.
- 匹配任何字符)
- 结束捕获小组$
- 在字符串示例:
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();
但是,第一个删除空条目,而第二个不删除。