【问题标题】:Regex between "\r\n"“\r\n”之间的正则表达式
【发布时间】:2023-03-14 16:43:02
【问题描述】:

我要匹配\r\n1.11.1 Entrepreneurship und Unternehmer\r\n

blabla \r\n1.11.1 Entrepreneurship und Unternehmer\r\nEs 

我尝试了以下正则表达式:

\\r\\n\d.\d\d.\d\s+\w\\r\\n

它应该是什么样子?

链接:https://regex101.com/r/QNXniB/1

【问题讨论】:

  • 不清楚您要达到的目标。您想匹配\r\n 之间的所有文本,或者您只想匹配以下表单中的文本:{number}.{number}.{number} {text}?
  • @zhulien 当我从 pdf 中提取文本时,我得到 ...ntrepreneurship zugesprochen?\r\n1.11.1 Entrepreneurship und Unternehmer\r\nEs gibt keine allgemeingültige Definition für die Begriffe „Entrepreneur“ und „Entrepre-\r\nneurship“. In der Literatur ... 并尝试匹配所有标题。所以它应该寻找\r\n1.11.1 Entrepreneurship und Unternehmer\r\n\r\n1.1.1 Entrepreneurship und Unternehmer\r\n\r\n1.1 Entrepreneurship und Unternehmer\r\n\r\n1. Entrepreneurship und Unternehmer\r\n
  • 这能回答你的问题吗? Regex for newline "\n\r" and digits
  • 我看到这与您之前的问题Regex for newline "\n\r" and digits 几乎完全相同。请回复那里的答案并解释为什么它们不起作用。

标签: c# regex


【解决方案1】:

该模式使用 \w 匹配单个单词字符,但在示例数据中,有 1 个或多个单词字符之间有空格。

注意转义点 \. 以匹配它的字面意思。

\\r\\n\d\.\d\d\.\d\s+\w+(?:\s+\w+)*\\r\\n
                     ^^^^^^^^^^^^^^

查看.NET regex demoC# demo

如果您想匹配文本中的实际换行符,则不应双重转义 \\r\\n

var tempAbsatz = "1. Entrepreneurship\r\nAus der Praxis\r\nAndrea  hat  Wirtschaftsingenieurwesen  studiert  und  ist  nun  seit  zwei  Jahren  in  der\r\nLogistik eines größeren mittelständischen Maschinenbauunternehmens tätig. Jörg ist\r\nBetriebswirt mit Schwerpunkt Steuern. Er arbeitet seit Abschluss seines Studiums vor\r\ndrei Jahren für eine große Wirtschaftsprüfungsgesellschaft. Mark, ein Wirtschaftsinfor-\r\nmatiker, führt seit gut zwei Jahren Beratungsprojekte für eine auf Digitalisierung spezia-\r\nlisierte Technologieagentur durch. Nathalie hat vor fünf Jahren das BWL-Studium mit\r\nSchwerpunkt Personal abgeschlossen. Sie leitet seit zwei Jahren die Personalentwick-\r\nlung eines mittelgroßen Elektronikunternehmens.\r\nDie  vier  lernten  sich  im  berufsbegleitenden  MBA-Studium  durch  eine  gemeinsame\r\nGruppenarbeit kennen. Ihre Aufgabe bestand darin, eine innovative Gründungsidee zu\r\nentwickeln. Bei den Vorbereitungen stellten sie fest, dass sie sich in der Verwendung\r\neiniger Begriffe nicht sicher sind. Mal sprechen sie von Unternehmern, mal von Selbst-\r\nständigen, manchmal auch von Entrepreneuren oder Existenzgründern. Antworten auf\r\ndie  Fragen,  welche  Rollen  Entrepreneure  einnehmen  und  warum  Entrepreneurship\r\nvolkswirtschaftlich so wichtig ist, haben sie auch nicht abrufbereit. Insofern wollen sie\r\nzuerst eine Begriffsklärung durchführen.\r\nHierfür recherchieren sie die folgenden Aspekte:\r\n•Was genau versteht man unter Entrepreneurship?\r\n•Lassen sich Unterschiede zwischen Entrepreneuren und Unternehmern finden?\r\n•Gibt es verschiedene unternehmerbezogene Entrepreneurship-Theorien?\r\n•Welche volkswirtschaftliche Signifikanz wird dem Entrepreneurship zugesprochen?\r\n1.11.1 Entrepreneurship und Unternehmer\r\nEs gibt keine allgemeingültige Definition für die Begriffe „Entrepreneur“ und „Entrepre-\r\nneurship“.  In  der  Literatur finden  sich  verschiedene  Ansätze  und  Zugänge  zum  Ver-\r\nständnis dessen, was unter einem Entrepreneur verstanden wird. Oft wird der innova-\r\ntive Charakter des Vorhabens zugrunde gelegt, manchmal auch von Inhabern kleiner\r\nund mittlerer Unternehmen, von selbstständig Tätigen oder von Unternehmensinha-\r\nbern (die auch Mitarbeiter beschäftigen) gesprochen. Eine Differenzierung erfolgt zum\r\nTeil zwischen Personen, die nur einmal gründen, und solchen, die häufiger Unterneh-\r\nmen aufbauen (Parker 2018, S. 6f.). Nachfolgend werden eine typische Begriffsverwen-\r\ndung und einige andere Ansätze skizziert.\r\n12Lektion 1\r\nwww.iubh.de\r\n\r\n";
var h = @"\r\n\d\.\d\d\.\d\s+\w+(?:\s+\w+)*\r\n";
foreach (Match mc in (new Regex(h)).Matches(tempAbsatz)) { 
    Console.WriteLine(mc.Value); 
}

输出

1.11.1 Entrepreneurship und Unternehmer

在有实际换行符时查看文本,您可能还会匹配以数字开头的整行,后跟 1 个或多个重复的点和数字:

^\d+(?:\.\d+)+ .*

查看regex 101 demo

注意,在 .NET 中 \d 也可以在其他语言中使用 match digits

【讨论】:

  • 谢谢,但我试过你的 regExpressions 'foreach (Match mc in (new Regex(h)).Matches(tempAbsatz)) { Console.WriteLine(mc.Value); }' 但它不会产生任何结果。
  • @te191fdsfa 如果要匹配该字符串中的换行符,请参阅ideone.com/PD3r7U 我已经更新了答案。
  • 好的,它应该只匹配第一个\r\n,比如\r\n1.21.2 Unternehmerbezogene Theorien des\r\n,而不是\r\n1.21.2 Unternehmerbezogene Theorien des\r\nEntrepreneurships\r\n。有解决办法吗?
  • @te191fdsfa 它符合问题中的预期结果。如果您只想要一个匹配项,您可以使用 Regex.Match 代替。如果你只想要一个匹配,如果下面有一个空行:\r?\n\d\.\d\d\.\d\s+\w+(?:\s+\w+)*\r?\n(?=$) 请参阅regex101.com/r/VhdtWm/1
【解决方案2】:

这应该处理它:

(?:(?:\\r\\n)|^)(?<index>[0-9]+\.(?:[0-9]+\.?)*)(?<title>.+?)(?:(?:\\r\\n)|$)

它看起来比实际上更复杂。其中大部分是为了更好的可用性。它的核心其实是:

(\\r\\n)(\d+\.(\d+\.?)*)(.+?)(\\r\\n).

地点:

  1. (\\r\\n) - 搜索文字字符串 "\r\n"
  2. (\d+\.(\d+\.?)*) - 匹配 数字 后跟 . 至少一次 可选地后跟 0 次或多次出现的另一个数字(后跟或不跟 .) . 有效案例1.1.11.1.1.1.1.3.4)。这将匹配索引
  3. (.+?) 匹配任何 非换行符 字符 1 次或多次,换句话说,匹配任何可能的 1+ 个字符 序列(仅包括空格)。这将匹配标题,并且可以根据您的需要进行改进。

由于标题格式{index}.(以. 结尾,如"1. Entrepreneurship")与{index}.{subindex}(不以. 结尾,如"1.11.1 Entrepreneurship und Unternehmer")之间存在差异,我们将继续需要检查两者。

正则表达式将匹配所有以&lt;index&gt;. 形式的索引开头的标题 + 0 个或多个&lt;subindex&gt;.&lt;subindex&gt; 形式的子索引(即{index}.{subindex}.{subindex} -> 2.14.3)。

查看结果here

您还需要处理字符串开始和结束的条件,我们不会有"\r\n" 序列。这可以分别通过(?:(?:\\r\\n)|^)(?:(?:\\r\\n)|$) 或简单的词来完成 - 搜索开始/结束\r\n 或位于 文本本身的开始/结束

在与给定正则表达式的每次匹配中,您可以通过命名组 indextitle 轻松访问匹配索引和标题的值。

string text = "<your-text>";
Regex regex = new Regex("(?:(?:\\r\\n)|^)(?<index>[0-9]+\.(?:[0-9]+\.?)*)(?<title>.+?)(?:(?:\\r\\n)|$)", RegexOptions.Singleline);

var match = regex.Match(text);

if (match.Success)
{
    var index = match.Groups["index"].Value;
    var title = match.Groups["title"].Value.Trim();
}

【讨论】:

  • 听起来不错。但它仍然匹配107.000 Euro für technologieorientierte Dienstleistungsbranchen, 113.000 Euro bei den9.500 und 12.400 Privatinvestoren tätig waren, davon ein Großteil als Business Angels。这里有什么解决办法?
  • 您没有在示例文本中指定这种情况。前面是\r\n吗?请通过包含的此类案例更新我们需要测试的示例文本。
猜你喜欢
  • 1970-01-01
  • 2021-09-24
  • 1970-01-01
  • 2011-09-27
  • 2018-08-27
  • 2010-09-07
  • 1970-01-01
  • 2022-07-27
相关资源
最近更新 更多