1

我需要使用正则表达式在 ASPX 文件中查找属性值。

这意味着您无需担心 HTML 格式错误或任何与 HTML 相关的问题。

我需要找到特定属性(LocText)的值。我想得到引号内的内容。值内的任何 ASPX 标记(例如 <%=、<%#、<%$ 等)对于此属性没有意义,因此被视为其一部分。

我开始使用的正则表达式如下所示:

LocText="([^"]+)"

这很好用,第一组,即结果文本,获取除双引号之外的所有内容,双引号是不允许的(必须使用 " 代替)

但是 ASPX 文件允许使用单引号 - 然后必须应用第二个正则表达式。

LocText='([^']+)'

我可以使用这两个正则表达式,但我正在寻找一种连接它们的方法。

LocText=("([^"]+)"|'([^']+)')

这也有效,但似乎效率不高,因为它创建了不必要的组数。我认为这可以通过使用反向引用以某种方式完成,但我无法让它工作。

LocText=(["']{1})([^\1]+)\1

我认为通过这个,我将单引号/双引号保存到第一组,然后我告诉它读取不是第一组中找到的字符的任何内容。这再次被第一组的引用所包围。显然,我错了,它不是那样工作的。

有什么办法,如何将前两个表达式连接在一起,创建最少数量的组,其中一个组是我想要获得的属性的值?是否可以对单/双引号值使用反向引用,还是我完全误解了它们的含义?

4

1 回答 1

2

我会说您的交替解决方案还不错,但是您可以使用命名捕获,因此始终可以在同一组的值中找到结果:

Regex regexObj = new Regex(@"LocText=(?:""(?<attr>[^""]+)""|'(?<attr>[^']+)')");
resultString = regexObj.Match(subjectString).Groups["attr"].Value;

解释:

LocText=          # Match LocText=
(?:               # Either match
 "(?<attr>[^"]+)" # "...", capture in named group <attr>
|                 # or match
 '(?<attr>[^']+)' # '...', also capture in named group <attr>
)                 # End of alternation

另一种选择是使用前瞻断言[^\1]不起作用,因为你不能在字符类中放置反向引用,但你可以在环顾中使用它们):

Regex regexObj = new Regex(@"LocText=([""'])((?:(?!\1).)*)\1");
resultString = regexObj.Match(subjectString).Groups[2].Value;

解释:

LocText=   # Match LocText=
(["'])     # Match and capture (group 1) " or '
(          # Match and capture (group 2)...
 (?:       # Try to match...
  (?!\1)   # (unless it's the quote character we matched before)
  .        # any character
 )*        # repeat any number of times
)          # End of capturing group 2
\1         # Match the previous quote character
于 2011-11-12T10:57:32.487 回答