【问题标题】:Regular Expressions to find and replace text用于查找和替换文本的正则表达式
【发布时间】:2012-08-13 06:42:08
【问题描述】:

我有一个字符串变量,下面是它的内容:

.....
数据元素 deAbtVersionNum
m_AttrParent Commercialcardsys::CommercialCardInt
m_AttrGUIFieldLabel "WEX_CI 3.02.01P20.1" appsys30::lngDbb
m_AttrdbType "char"
.....

如 ... 所示,可能还有其他文本。

在第三行中,我们有“WEX_CI 3.02.01P20.1”(这是从底部开始唯一存在 WEX.. 的地方。)

我需要将 3.02.01P20.1(完全)替换为新版本,例如 3.02.01P20.1.NEW

我已经能够使用一种肮脏的方法来做到这一点,该方法查找“Wex 然后找到下一个”的索引,等等。

                int start = CItext.LastIndexOf("\"WEX") + 1;
                int end = CItext.IndexOf("\"", start);
                string text = CItext.Substring(start, end - start + 1);

                string[] parts = text.Split(new Char[] { ' ' });
                string editedText = parts[0] + " " + LabelName;
                CItext = CItext.Replace(text, editedText);

CIText 是我必须编辑的字符串。 LabelName 是我要放置的字符串,而不是 3.02.01P20.1

谁能建议我任何其他清洁方法?

【问题讨论】:

  • 是什么让你认为现有的逻辑是肮脏的,而正则表达式是干净的?
  • 因为它的行太多了。我欢迎其他方法,不一定是正则表达式
  • 使用String.Replace 你不需要正则表达式。这行得通吗?
  • @AkshayJ 你能显示“太多行”吗?我们可以从那里开始。
  • @AkshayJ 你在哪里更改版本?

标签: c# regex winforms


【解决方案1】:

试试这个正则表达式

var result =   Regex.Replace(text,@"(WEX_CI[\s][\da-zA-Z\.]+)","$1.NEW");

【讨论】:

  • 您是否将 .NEW 添加到 3.02.01P20.1 ?我只想用 3.02.01P20.1.NEW 替换整个 3.02.01P20.1。请更新
  • 不,我没有替换...但是首先使用此代码找到 WEX_CI,然后用 $1 替换它之后的内容,这意味着 3.02.01P20.1 替换为 3.02.01P20.1.NEW 。你可以检查link
【解决方案2】:

我认为您可以使用带有“前瞻”的正则表达式。试试这个。

var result = Regex.Replace(text, "(?<=WEX_CI )[^\"]+", "NEW", RegexOptions.Multiline);

【讨论】:

  • 我想要“WEX_CIWHATEVER”到“WEX_CINEW”,你的实现会这样做吗?甚至连引号也在那里。
  • 您的解决方案无效。您是否注意过“WEX_CI..”之前出现的文字?
猜你喜欢
  • 1970-01-01
  • 2013-07-11
  • 1970-01-01
  • 1970-01-01
  • 2020-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多