当前位置: 首页 > 面试题库 >

如何替换字符串中的奇数模式?

轩辕欣可
2023-03-14
问题内容

我正在用SQL创建一个临时过程,因为我有一个用markdown编写的表的值,因此该表在Web浏览器中显示为HTML (markdown到HTML转换)

该列的字符串当前如下所示:

Questions about **general computing hardware and software** are off-topic for Stack Overflow unless they directly involve tools used primarily for programming. You may be able to get help on [Super User](http://superuser.com/about)

我目前正在使用粗体和斜体文本。这意味着 (以粗体显示的情况下), 我需要更换奇N次的格局**<b>乃至倍</b>
我看到了replace(),但是它在字符串的所有模式上执行替换。

那么,如何仅当它是奇数或偶数时才替换子字符串?

更新:
有些人想知道我使用的是哪种模式,所以请在这里看看。

如果需要,还可以添加一个额外的功能: 降到HTML链接的markdown样式的链接看起来并不那么简单。


问题答案:

使用该STUFF函数和一个简单的WHILE循环

CREATE FUNCTION dbo.fn_OddEvenReplace(@text nvarchar(500), 
                                      @textToReplace nvarchar(10), 
                                      @oddText nvarchar(10), 
                                      @evenText nvarchar(500))
RETURNS varchar(max)
AS
BEGIN
    DECLARE @counter tinyint
    SET @counter = 1

    DECLARE @switchText nvarchar(10)
    WHILE CHARINDEX(@textToReplace, @text, 1) > 0
    BEGIN
        SELECT @text = STUFF(@text, 
                    CHARINDEX(@textToReplace, @text, 1), 
                    LEN(@textToReplace), 
                    IIF(@counter%2=0,@evenText,@oddText)),
                @counter = @counter + 1
    END
    RETURN @text
END

您可以像这样使用它:

SELECT dbo.fn_OddEvenReplace(column, '**', '<b>', '</b>')
FROM table

更新:

这被重写为SP:

CREATE PROC dbo.##sp_OddEvenReplace @text nvarchar(500), 
                                  @textToReplace nvarchar(10), 
                                  @oddText nvarchar(10), 
                                  @evenText nvarchar(10),
                                  @returnText nvarchar(500) output
AS
BEGIN
    DECLARE @counter tinyint
    SET @counter = 1

    DECLARE @switchText nvarchar(10)
    WHILE CHARINDEX(@textToReplace, @text, 1) > 0
    BEGIN
        SELECT @text = STUFF(@text, 
                    CHARINDEX(@textToReplace, @text, 1), 
                    LEN(@textToReplace), 
                    IIF(@counter%2=0,@evenText,@oddText)),
                @counter = @counter + 1
    END
    SET @returnText = @text
END
GO

并执行:

DECLARE @returnText nvarchar(500)
EXEC dbo.##sp_OddEvenReplace '**a** **b** **c**', '**', '<b>', '</b>', @returnText output

SELECT @returnText


 类似资料:
  • 我正在努力解决一个关于正则表达式的小问题。 我想用另一个长度相同但字符不同的子字符串替换特定字符的所有奇数长度子字符串。指定字符的所有偶数序列应保持不变。 一个字符串包含字母a、b和y,y的所有奇数长度序列都应替换为z: 另一个可能的例子是: 变成 使用正则表达式匹配所有奇数长度的序列没有问题。 不幸的是,我不知道如何将这些匹配的长度信息合并到替换字符串中。我知道我必须以某种方式使用反向引用/捕获

  • 如果给一个字符串,比如“去医学院!”例如,如何仅替换偶数字符?问题是,虽然我的代码处理第一个单词,但单词之间的空格本身算作一个字符,并将第二个单词中的替换搞乱,第二个单词的第一个字母被归类为偶数。 这是我的尝试 这将给出输出“gomd!”(第二个字母正确替换为表示偶数,但第二个单词的第一个字母不应替换为“第一个”不是“偶数”。如何使索引忽略空格? 答案最好不包含数组,只包含Char和String方

  • 我希望我的程序替换输入字符串中的每个元音。

  • 问题内容: 我试图用括号内的数字本身替换字符串中的任何数字序列。所以输入: 应该有一个输出: 我正在尝试使用String.replace(a,b)实现它,但没有成功。 问题答案: 试试这个,看看是否可行。 由于您需要使用正则表达式,因此可以考虑使用而不是。

  • 我有一个字符串在C#与"维基语法",我想取代的值。 问题是,我想将成对的值替换为不同的值。

  • 问题内容: 我正在使用一个喜欢: 我使用的是哪里。这行代码对我不起作用。我想知道自己在做什么错? 问题答案: 尽管看起来可能存在一些语法问题,但是代码看起来或多或少还可以。这是一个工作示例: