如果找到换行符,我的正则表达式不匹配

时间:2018-09-04 16:00:11

标签: c# regex

我有一个大的字符串,由换行符分隔。

示例:

  

这是我的第一句话,在这里我将搜索我的单词

     

这是我的第二句话

使用下面的代码,如果我搜索“ my”,它将仅从第一句话而不是第二句话返回“ my”的2个实例。

我希望显示在其中找到该词组的句子-可以正常工作,但只是在找到第一个换行符后不搜索任何内容。

代码;

var regex = new Regex(string.Format("[^.!?;]*({0})[^.?!;]*[.?!;]", userSearchCriteraInHere, RegexOptions.Singleline));
var results = regex.Matches(largeStringInHere);

for (int i = 0; i < results.Count; i++)
{
   searchCriteriaFound.Append((results[i].Value.Trim()));
   searchCriteriaFound.Append(Environment.NewLine);
}

代码编辑:

string pattern = @".*(" + userSearchCriteraInHere + ")+.*";
            RegexOptions options = RegexOptions.Multiline;

            foreach (Match m in Regex.Matches(largeStringInHere, pattern, options))
            {
                searchCriteriaFound.Append(m.Value);
            }

5 个答案:

答案 0 :(得分:1)

是否有特定的原因不能以以下方式多次搜索“我”一词:

(my)+

您可以在Regex101上的以下URL上对其进行测试:https://regex101.com/r/QIHWKf/1

如果要匹配带有“ my”的整个句子,则可以使用以下内容:

.*(my)+.*

https://regex101.com/r/QIHWKf/2

这是完整的句子,而第一组是“我的”。

答案 1 :(得分:1)

var userSearchCriteraInHere = "my";
var largeStringInHere = @"This is my first sentence and here i will search for the word my.

This is my second sentence.";

var regex = new Regex(string.Format("[^.!?;]*({0})[^.?!;]*[.?!;]", userSearchCriteraInHere), RegexOptions.Singleline);
var results = regex.Matches(largeStringInHere);
Console.WriteLine(results.Count);

var searchCriteriaFound = new StringBuilder();
for (int i = 0; i < results.Count; i++)
{
  searchCriteriaFound.Append((results[i].Value.Trim()));
  searchCriteriaFound.Append(Environment.NewLine);
}

Console.Write(searchCriteriaFound.ToString());

这将返回以下输出:

2
This is my first sentence and here i will search for the word my.
This is my second sentence.

正如您的正则表达式期望的那样,我确实需要在句子的末尾添加句点。

答案 2 :(得分:0)

更改

Regex(string.Format("[^.!?;]*({0})[^.?!;]*[.?!;]", userSearchCriteraInHere, RegexOptions.Singleline)

收件人

Regex(string.Format("[^.!?;]*({0})[^.?!;]*[.?!;]", userSearchCriteraInHere, RegexOptions.Multiline)

这会将符号^和$的含义更改为一行的开头/结尾,而不是整个字符串。

答案 3 :(得分:0)

您可以使用单词边界\b来防止它成为更大匹配项的一部分,例如mystery,并将选项更改为RegexOptions.Multiline而不是RegexOptions.Singleline来让{ {1}}和^与行尾匹配。

$

Regex demo

Test

答案 4 :(得分:0)

要获取所有包含“我的”单词的行,您可以尝试以下操作:

代码

static string GetSentencesContainMyWord(StreamReader file)
            {
                int counter = 0;
                string line;
                var sb = new StringBuilder();
                while ((line = file.ReadLine()) != null)
                {
                    if (line.Contains("my"))
                        sb.Append(line + Environment.NewLine);
                    counter++;
                }
                return sb.ToString();
            }