R gsub期间保留换行符并在字符串中有选择地缩进

R gsub期间保留换行符并在字符串中有选择地缩进,r,regex,newline,R,Regex,Newline,原始标题:在gsub期间将换行符保留在字符串中 有一个例子,我尝试将JSON转换为降价无序列表。差不多完成了,但有一个模式我无法处理。如果字符串中有空格、换行符、空格序列,则它将被视为列表项连字符。如果我尝试使用一些对换行符的引用来避免这种情况,那么就没有任何效果 输入JSON: 首选输出(两个空格缩进)减价: - Info - Python - The Ultimate Python Beginner's Handbook - Python Like You Mean It

原始标题:在gsub期间将换行符保留在字符串中

有一个例子,我尝试将JSON转换为降价无序列表。差不多完成了,但有一个模式我无法处理。如果字符串中有空格、换行符、空格序列,则它将被视为列表项连字符。如果我尝试使用一些对换行符的引用来避免这种情况,那么就没有任何效果

输入JSON:
首选输出(两个空格缩进)减价:

- Info
  - Python
    - The Ultimate Python Beginner's Handbook
    - Python Like You Mean It
    - Automate the Boring Stuff with Python
    - Data science Python notebooks
  - Frontend
    - CodePen
    - JavaScript - Wikipedia
    - CSS-Tricks
    - Butterick’s Practical Typography
    - Front-end Developer Handbook 2019
    - Using Ethics In Web Design
    - Client-Side Web Development
  - Stack Overflow
  - HUP
  - Hope in Source
要生成降价,我使用以下两个脚本:
generate\u md()

library(jsonlite)
生成您可以使用的\u md

gsub(\\w\\h+-\\h(*跳过)(*F)|-(?=\\h)”,“-”,x,perl=TRUE)
看。详情:

  • \w
    -一个单词char
  • \h+
    -一个或多个水平空白
  • -
    -a
    -
    字符
  • \h
    -水平空白
  • (*SKIP)(*F)
    -忽略到目前为止匹配的文本,使匹配失败,并从失败的位置开始搜索
  • |
    -或
  • -
    -a
    -
    字符
  • (?=\h)
    -后面紧接着一个水平空白
您可以使用

gsub(\\w\\h+-\\h(*跳过)(*F)|-(?=\\h)”,“-”,x,perl=TRUE)
看。详情:

  • \w
    -一个单词char
  • \h+
    -一个或多个水平空白
  • -
    -a
    -
    字符
  • \h
    -水平空白
  • (*SKIP)(*F)
    -忽略到目前为止匹配的文本,使匹配失败,并从失败的位置开始搜索
  • |
    -或
  • -
    -a
    -
    字符
  • (?=\h)
    -后面紧接着一个水平空白

在我考虑了这个问题和字符串的结构并阅读了Lookback之后,我终于想出了解决方案

md\u recurs
行需要修改为:

md\u递归
这意味着必须将
gsub()
模式
参数修改为:

(?
这意味着:

  • 替换连字符
    -
    (两个空格和一个连字符
    -
  • 如果前面没有单词字符串和空格
    (?和
  • 如果后面没有空格
    (?=)

在我考虑了这个问题和字符串的结构并阅读了Lookback之后,我终于想出了解决方案

md\u recurs
行需要修改为:

md\u递归
这意味着必须将
gsub()
模式
参数修改为:

(?
这意味着:

  • 替换连字符
    -
    (两个空格和一个连字符
    -
  • 如果前面没有单词字符串和空格
    (?和
  • 如果后面没有空格
    (?=)

我真的很感谢你快速而透彻的回答!谢谢!但我不得不修改我的问题。我可以请你看一下吗?@hermanp你的帖子现在太长了,你没有解释新问题是什么。我将重写整个问题。我原以为第一个最小的示例已经抓住了我的整个问题,但经过一番尝试后,它似乎已经解决了没有。我编辑了我的问题以更好地反映问题,但你是对的,它太长了。因此,我将重写它,但不幸的是,输入不会像以前那样简洁。@hermanp Try
sub(^\\h*\\K-(?=\\h)”,“-”,md_recurs,perl=TRUE)
@hermanp我不确定,但似乎你可以尝试
gsub(“\\w\\h+-\\h(*跳过)(*F)|-(?=\\h)”,“-”,x,perl=TRUE)
。它将允许与您的答案中相同的行为,但在“查找”中可以使用任意数量的水平空格。我非常感谢您快速而彻底的回答!谢谢!但我不得不修改我的问题。我可以请您看一下吗?@hermanp您的帖子现在太长了,您没有解释新问题是什么。我将重写整个问题。我原以为第一个最小的示例已经抓住了我的整个问题,但经过一次尝试后,似乎没有。我编辑了我的问题,以更好地反映问题,但你是对的,它太长了。因此我将重写它,但不幸的是,输入将不像以前那样简洁。@hermanp Try
sub(“^\\h*\\K-(?=\\h)”,“-”,md\u recurs,perl=TRUE)
@hermanp我不确定,但您似乎可以尝试
gsub(\\w\\h+-\\h(*SKIP)(*F)|-(?=\\h)”,“-”,x,perl=TRUE)
。它将允许与您的答案中相同的行为,但在查找中可以使用任意数量的水平空格。
md\u recurs
支持什么?请尝试
sub(^\\h*\\K-(?=\\h)”,“-”,md\u recurs,perl=TRUE)
我应该承认我是递归新手,不能很好地回答你的问题,但是…需要这个命令来为降价做正确的缩进。否则它将不是嵌套的无序列表,只是无序列表。我恐怕我没有足够的资格正确回答
md_recurse
等一下。来吧,你有code,
md_recurse请查看我对SO帖子的回答。
md_recurse
中的文本是递归生成的,因此我不知道应该在哪一步检查它并将其呈现给您。请容忍我:我没有CS学位,并且在实现递归功能后非常高兴。我渴望了解一种方法来恢复ab这个变量的值。
md_recurse
有什么作用?试试
sub(^\\h*\\K-(?=\\h)”,“-”,md_recurse,perl=TRUE)
我应该承认我对递归不熟悉,不能很好地回答你的问题,但是…需要这个命令来为标记做正确的缩进。其他