查找并用正则表达式替换标识符

我正在逐行解析包含语句的文件。我要:

  1. 识别所有包含作业的行。
  2. 替换某些类型的标识符(输入和输出)。

如果一行具有以下两种形式之一,则它是一个分配:

DataType Identifier = ...
Identifier = ...

数据类型必须为以下之一:“ R”,“ L”,“ H”,“ X”,“ I”。数据类型是可选的。数据类型和标识符周围的任何位置都允许有空格。包含语句的行示例:

L Input = ...
DigitalOutput = ...
  R Output= ...
H AnalogInput=...
  X Output   = ...

解析以上语句后的预期结果将是:

L Deprecated = ...
DigitalOutput = ...
  R Deprecated= ...
H AnalogInput=...
  X Deprecated   = ...

该文件还包含除赋值外的其他语句,因此它对于标识具有赋值的行并在这种情况下仅替换标识符很重要。我尝试使用正向查找和正向查找的正则表达式:

public void ReplaceIdentifiers(string line)
{
  List<string> validDataTypes = new List<string>{"R","L","H","X","I"};
  List<string> identifiersToReplace = new List<string>{"Input","Output"};
  string = ...
  Regex regEx = new Regex(MyRegEx);
  regEx.Replace(line,"Deprecated");
}

MyRegex在表单上的位置(伪代码):

$@"(?<=...){Any of the two identifiers to replace}(?=...)"

后面的样子:

Start of string OR 
Zero or more spaces,Any of the valid data types,Zero or more spaces OR
Zero or more spaces

前瞻:

Zero or more spaces,=

我没有设法正确设置正则表达式。如何写正则表达式?

xing3993 回答:查找并用正则表达式替换标识符

由于.NET正则表达式支持非固定长度的Lookbehind,因此您可以使用以下模式:

(?<=^\s*(?:[RLHXI]\s+)?)(?:Input|Output)(?=\s*=)

并替换为Deprecated

Regex demo

C#示例:

string input = "L Input = ...\n" +
               "DigitalOutput = ...\n" + 
               "  R Output= ...\n" + 
               "H AnalogInput=...\n" + 
               "  X Output   = ...\n" + 
               "IOutput = ...\n" + 
               "Output = ...";

Regex regEx = new Regex(@"(?<=^\s*(?:[RLHXI]\s+)?)(?:Input|Output)(?=\s*=)",RegexOptions.Multiline);
string output = regEx.Replace(input,"Deprecated");
Console.WriteLine(output);

输出:

L Deprecated = ...
DigitalOutput = ...
  R Deprecated= ...
H AnalogInput=...
  X Deprecated   = ...
IOutput = ...
Deprecated = ...

Try it online

,

对于所示的特殊情况,您的正则表达式可以是:

{
    "rules": {
        "user": {
            "$username": {
                ".write": "auth != null",".validate": "$username.matches(/^.{6,23}$/)"
            }
        }
    }
}

用多行选项替换为^(\s*[RLHXI]\s+)(?:Output|Input)(\s*=)

如果在编译时无法同时输入要替换的类型名称和标识符,则可以使用以下格式的$1Deprecated$2

string.format

您传递给它的参数将是字符串列表,并使用^(\s*(?:{0})\s+)(?:{1})(\s*=) |结合在一起:

string.Join
本文链接:https://www.f2er.com/3154183.html

大家都在问