获取特定字符串模式

问题描述:

我有以下字符串:获取特定字符串模式

string str ="dasdsa|cxzc|12|#dsad#|czxc"; 

我需要返回一个函数:#dsad#

考虑考虑是#dsad#是动态创建的,因此可能会有所不同,它的长度也可以改变

如何使用正则表达式(搜索两个哈希标签之间的字符串)或其他方法(如果可用)来执行此操作?

+0

“正在考虑以它的长度可也可以改变“你能澄清一下'#dsad#'是什么,如果可以改变? –

+0

它是一个数据库值,str是一个cookie中使用的字符串 – Sora

+0

它是一个管道分隔的字符串吗?用'|'分割,并抓取以'#'开头和结尾的值。请参阅http://ideone.com/yk34S3 –

如果字符串是管道分隔的字符串,可以与|分裂,并抓住启动,并与#结束值。

var str ="dasdsa|cxzc|12|#dsad#|czxc"; 
var result = str.Split('|').Where(p => p.StartsWith("#") && p.EndsWith("#")).ToList(); 
foreach (var s in result) 
    Console.WriteLine(s); 

请参阅the online C# demo

如果你只需要一个值,使用.FirstOrDefault()

var result = str.Split('|') 
    .Where(p => p.StartsWith("#") && p.EndsWith("#")) 
    .FirstOrDefault(); 
+0

就我个人而言,[我更喜欢.NET Fiddle](https://dotnetfiddle.net/wRbLqC)在Ideone上。它感觉更直观,更快。 –

+1

@UweKeim:是的,它也很棒。我更喜欢在[de gustibus non est disputandum](https://en.wikipedia.org/wiki/De_gustibus_non_est_disputandum)方面。 –

+1

看起来像今天是一个downvoting的日子。 +1给所有回答的人。 –

假设你想匹配上,你可以采取以下的正则表达式#字符:

#[a-z]+#

  • “[]” 字符集
  • “+” 一个字符或多个

如果你想让你的字符串总是为1 | 2 | 3 |#4#| 5,你可以使用String.Split('|')方法,并且只取第四个结果元素。

+1

今天看起来像是一个低调的日子。 +1给所有回答的人。 –

假设#dasd#字符串中只出现一次尝试这个办法:

String a = "asd|asd|#this#|asdasd"; 


string m = Regex.Match(a, @"#.+#").Value; 

Console.WriteLine(m); 

.+搜索任何字符

如果字符串使用|作为分隔符,你也可以拆分字符串。

string [] array = a.Split('|'); 

// this would get a list off all values with `#` 
List<string> found_all = array.Where(x => x.Contains("#")).ToList(); 

// this would get the first occurrence of that string. If not found it will return null 
string found = array.FirstOrDefault(x => x.Contains("#")) 
+1

看起来像今天是一个低调的日子。 +1给所有回答的人。 –

根据你需要寻找这两个主题标签之间的字符串后面将正则表达式的问题给出的输入,

^.*#(.*)#.*$ 

如果数据在2个哈希标签之间为空,那么正则表达式不会失败。这将需要空值。

+1

今天看起来像是一个低调的日子。 +1给所有回答的人。 –

这似乎是由五部分数据的CSV分隔数据。

提取每个部分,然后使用正则表达式将其投影到动态实体中以表示每个部分。

string data = "dasdsa|cxzc|12|#dsad#|czxc"; 

string pattern = @"(?<Section1>[^|]+)\|(?<Section2>[^|]+)\|(?<Section3>[^|]+)\|(?<Section4>[^|]+)\|(?<Section5>[^|]+)"; 

var results = 
Regex.Matches(data, pattern, RegexOptions.ExplicitCapture) 
    .OfType<Match>() 
    .Select(mt => new 
    { 
      One = mt.Groups["Section1"].Value, 
      Two = mt.Groups["Section2"].Value, 
      Three = mt.Groups["Section3"].Value, 
      Four = mt.Groups["Section4"].Value, 
      Five = mt.Groups["Section5"].Value, 
    }) 
    .ToList(); 

    Console.WriteLine(results[0].Four); // #dsad# 

一旦从results包含的内容完整提取出来。因为它只是多行捕获的列表,其中每行只包含该行的一个数据实体。

从适当的属性中提取;而我们的最终结果上有一条线,但我们可以得到的数据作为示例所示WriteLine:那#DSAD#是动态创建的,因此可能会有所不同

enter image description here

+1

看起来像今天是一个低调的日子。 +1给所有回答的人。 –