【问题标题】:C# Regex: How to break up plain text stringC# 正则表达式:如何分解纯文本字符串
【发布时间】:2014-01-18 04:31:58
【问题描述】:

我有一个问题想知道如何解决。

我有一个从包含问题列表的 pdf 文件中读取的字符串。 格式为:

问题编号:1

xxxxxxx(问题文本)

A) xxxx (多选) B) xxxx C) xxxx ...

答案:xxxxx

问题编号:2

xxxxxxx(问题文本)

....(等等)

列表中有大约 200 个问题。

我正在尝试使用正则表达式来分解文本,以便每个问题都可以放在单独的字符串中。

我以前用 html 和 xml 文档做过这个,但它们很容易,因为有很多识别标签,比如双引号、方括号和圆括号。

但我不知道如何仅使用文本来执行此操作。我尝试了很多组合,但似乎我无法获得正确的格式:

var questionPattern = @"QUESTION NO:(.*)QUESTION NO:";
var questionMatch = Regex.Matches(pdfText, questionPattern, RegexOptions.Singleline);

我在想,有没有办法:

var questionPattern = @"(?<=QUESTION NO:)[^QUESTION NO:]*";

[^QUESTION NO:]* 在哪里读取每个问题标头之后的所有内容,直到它在下一个问题标头时停止?

显然这是错误的格式,但我希望人们能理解我想要表达的意思。

任何帮助将不胜感激。
谢谢!

【问题讨论】:

  • 我知道我可以通过 split 轻松做到这一点,但我想知道是否可以使用 Regex 来完成,谢谢。
  • 感谢您的编辑,顺便说一句。

标签: c# regex string list file-io


【解决方案1】:

这可能是您将获得的最好结果 - 取决于 Answer。前瞻需要有条件,并且会破坏整个表达式。

(QUESTION NO: \d+[\S\s]*?Answer.*\n*)

工作示例:http://regex101.com/r/nC6yA1

【讨论】:

  • remus,我在我的程序中进行了测试,但它似乎不起作用。有什么理由让它可以在您的正则表达式测试器中工作,而不是特别是在 c# 中?
  • 哦,没关系,我只需要摆脱 RegexOptions.Singleline 参数。谢谢!
  • 另外,由于列表中有200多个问题,我将“\d+”改为“\d*”
  • 太棒了!此外,将 + 更改为 * 不会以这种方式更改数字 - * 表示 0 位或更多位,+ 表示 1 位或更多位。因为那里永远不会没有数字,所以我想它是可以互换的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多