2017-06-29 90 views
1

这与类似文章略有不同,括号中有星号。 例如输入:正则表达式在括号之间提取文本与星号配对

内容十分重要(*需要抓住这个文本*)尤达

我想Jennifers post可以改变这个,但我的尝试都失败了。

 //Regex regex = new Regex("\\((?<TextInsideBrackets>\\w+)\\)"); //original 
     Regex regex = new Regex("\\(\\*(?<TextInsideBrackets>\\w+)\\*\\)"); // my attempt 
     string incomingValue = "Autocycleprestartcase := 20; (* Yayitme ve Konveyoru bosaltabilir *)"; 
     string insideBrackets = null; 
     Match match = regex.Match(incomingValue); 
     if (match.Success) 
     { 
      insideBrackets = match.Groups["TextInsideBrackets"].Value; 
     } 

对此有何建议?

此外,我想从输入行中删除封闭的parethesis/asterisk对的文本。

所以上面的输出会给我

内容十分重要尤达

和值

需要抓住这个文本

感谢

+0

其实,你应该使用https://stackoverflow.com/a/378447/3832970。 –

+0

@Wiktor,该答案适用于括号内的所有内容,但对于此要求,括号*需要*与星号配对。 –

+0

然后你接受了一个不正确的答案。 '[\ w] +'只能匹配一个或多个空格或字母/数字/'_'。你需要'@“\(\ *(。*?)\ * \)”' –

回答

1

将其更改为

Regex regex = new Regex("\\(\\*(?<TextInsideBrackets>[\\w ]+)\\*\\)"); 
                ^^^^^^ 

,让空间

+0

谢谢,托马斯。你能告诉我如何删除包含的文本和周围的括号/星号对吗? (见编辑) –

+0

使用Regex.Replace代替Regex.Match @SkippyVonDrake –

1

这里是一个解决方案,使这两个值,而重新使用动态模式:

string incomingValue = "Autocycleprestartcase := 20; (* Yayitme ve Konveyoru bosaltabilir *)"; 
string pattern = @"\(\*\s*(.*?)\s*\*\)"; 
string insideBrackets = Regex.Match(incomingValue, pattern).Groups[1].Value ?? string.Empty; 
Console.WriteLine(insideBrackets); // => Yayitme ve Konveyoru bosaltabilir 
Console.WriteLine(Regex.Replace(incomingValue, [email protected]"\s*{pattern}", string.Empty)); // => Autocycleprestartcase := 20; 

C# demo

花纹细节

  • \( - 字面*
  • \s* - - 字面(
  • \*(注意单个反斜杠用作串经由逐字字符串@""定义)0+空白字符(修整左边的值)
  • (.*?) - 组1捕获除换行符以外的零个或多个字符,尽可能少,直到后续子模式的第一次出现
  • \s* - 零个或多个空格
  • \*(右修整) - 字面*
  • \) - 字面)

要获得第二值,你可以使用相同的模式,但在开始处添加\s*(零个或多个空格),用Regex.Replace(incomingValue, [email protected]"\s*{pattern}", string.Empty)完成什么。

+0

感谢您的解释!最终它会沉入。(mabye) –

+0

@SkippyVonDrake:我想我的回答完全涵盖了你的问题。如果您对此解决方案有任何疑问或疑问,请告诉我。 –

+0

是的,你的答案更正确。为了我的需要,我可以使用任何一种解决方案,因为附上的文字总是字母。再次感谢。 –