Javascript 替换包含文档注释的代码行
Posted
技术标签:
【中文标题】Javascript 替换包含文档注释的代码行【英文标题】:Javascript replace code line including doc comment 【发布时间】:2021-02-05 04:03:27 【问题描述】:我正在使用 AutoRest 生成客户端代码。使用 AutoRest,您可以添加自定义转换脚本来更改生成的代码。
我正在尝试从使用 javascript 正则表达式替换生成的代码中删除两个接口属性。但我无法弄清楚正确的正则表达式是什么。
这是我需要修改的一段代码:
// <auto-generated>
// Code generated by Microsoft (R) AutoRest Code Generator.
// Changes may cause incorrect behavior and will be lost if the code is
// regenerated.
// </auto-generated>
namespace Test.AcmeWeb.Repositories.Test.Products
using Microsoft.Rest;
using Models;
using Newtonsoft.Json;
using System.Collections;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
/// <summary>
/// Acme Products API
/// </summary>
public partial interface IApiProducts : System.IDisposable
/// <summary>
/// The base URI of the service.
/// </summary>
System.Uri BaseUri get; set;
/// <summary>
/// Gets or sets json serialization settings.
/// </summary>
JsonSerializerSettings SerializationSettings get;
/// <summary>
/// Gets or sets json deserialization settings.
/// </summary>
JsonSerializerSettings DeserializationSettings get;
/// <summary>
/// CreateAppointment
/// </summary>
/// <remarks>
/// Creates an appointment, given a timeslot id, order id and remark,
/// wrapped in a requestmodel.
/// </remarks>
/// <param name='label'>
/// Possible values include: 'default', 'Acme'
/// </param>
/// <param name='body'>
/// </param>
/// <param name='customHeaders'>
/// The headers that will be added to request.
/// </param>
/// <param name='cancellationToken'>
/// The cancellation token.
/// </param>
Task<HttpOperationResponse<ErrorResponse>> ApiProductsAppointmentsCreateAppointmentPUTWithHttpMessagesAsync(string label, RequestDataAppointmentRequestModel body = default(RequestDataAppointmentRequestModel), Dictionary<string, List<string>> customHeaders = null, CancellationToken cancellationToken = default(CancellationToken));
我特别想从此代码中删除以下两行(包括 cmets):
/// <summary>
/// Gets or sets json serialization settings.
/// </summary>
JsonSerializerSettings SerializationSettings get;
/// <summary>
/// Gets or sets json deserialization settings.
/// </summary>
JsonSerializerSettings DeserializationSettings get;
我可以运行两个单独的正则表达式替换调用来一次替换一个。我的正则表达式目前在第一行看起来像这样,包括评论。
\/\/\/ <summary>\r\n[\s]+\/\/\/Gets or sets json serialization[^]+JsonSerializerSettings SerializationSettings get;
但不幸的是,这似乎与任何模式都不匹配。
我必须如何更改我的正则表达式才能使其正常工作?
现场演示可以在这里找到:https://regexr.com/5eleb
【问题讨论】:
试试这个regex101.com/r/sYKVjy/1\/\/\/ <summary>.*\r?\n.*Gets or sets json (?:de)?serialization.*\r?\n.*\/\/\/ <\/summary>\r?\n.*JsonSerializerSettings (?:De)?[sS]erializationSettings get; \s*
【参考方案1】:
文本中有序列化和反序列化,您可以在\r\n
中将\r
设为可选
要匹配这两个部分,您可以使用
\/\/\/ <summary>\r?\n[^\S\r\n]*\/\/\/ Gets or sets json (?:de)?serialization.*\r?\n[^\S\r\n]*\/\/\/ <\/summary>\r?\n[^\S\r\n]*JsonSerializerSettings (?:De)?[sS]erializationSettings get; \s*
说明
\/\/\/ <summary>\r?\n
匹配摘要部分的开头
[^\S\r\n]*\/\/\/
匹配不带换行符的可选空白字符和///
Gets or sets json (?:de)?serialization.*\r?\n
将文本与可选的 de
匹配,并且该行的其余部分包括换行符
[^\S\r\n]*\/\/\/ <\/summary>\r?\n
匹配可选的空白字符、///
和包含换行符的最后一个摘要部分
[^\S\r\n]*JsonSerializerSettings
匹配可选的空白字符,后跟JsonSerializerSettings
,这两个部分都存在
(?:De)?[sS]erializationSettings get; \s*
匹配可选的De
,然后是大写或小写的s
,后跟erializationSettings
,以及该行的其余部分。 \s*
将匹配尾随空格字符,包括换行符
在替换中使用空字符串。
查看regex demo
您也可以将其作为一个块进行匹配,但在您尝试的模式中,它不会考虑结束摘要部分。您还必须使 [^]+?
非贪婪以防止过度匹配。
\/\/\/ <summary>\r?\n[\s]+\/\/\/ Gets or sets json (?:de)?serialization[^]+?JsonSerializerSettings (?:De)?[sS]erializationSettings get;
Regex demo
【讨论】:
以上是关于Javascript 替换包含文档注释的代码行的主要内容,如果未能解决你的问题,请参考以下文章